初识SpringSecurity

目录

前言

特点

快速开始

导入依赖

运行项目

访问服务

权限控制

实现UserDetails接口

添加SecurityConfig配置类

测试接口DemoController

设置权限控制authorizeHttpRequests

结果分析

总结


前言

Spring Security是一个强大且高度可定制的身份验证和访问控制框架。它是保护基于Spring的应用程序的事实标准。


Spring Security是一个专注于为Java应用程序提供身份验证和授权的框架。与所有Spring项目一样,Spring Security的真正力量在于它可以多么容易地扩展以满足自定义需求。

特点

  • 对身份验证和授权的全面且可扩展的支持

  • 防止会话固定、点击劫持、跨站点请求伪造等攻击

  • Servlet API集成

  • 与Spring Web MVC的可选集成

快速开始

导入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

运行项目

查看控制台的输出,会发现出现了警告。

警告翻译:

使用生成的安全密码:e3e4d1a9-2520-49a8-bb0b-359c2ed19314
此生成的密码仅供开发使用。在生产环境中运行应用程序之前,必须更新您的安全配置。 

因为我们只是引入了SpringSecurity的依赖,并没有对其进行配置。所以此时使用的都是默认的配置,这些配置都是可以自定义的。

访问服务

访问后会跳转到登录页面,默认用户名user,密码在控制台中查看。默认的登录请求为/login,只有登录成功后才能继续访问。

输入用户名和密码,会跳转页面。但是我们没有设置登录成功后的页面跳转,所以结果是404 Not Found。其实我们没有必要去设置这个跳转页面,因为开发都是基于前后端分离的模式。前端发起登录请求,我们后端响应结果就行了。也就意味着这个登录页面也是多余的,后面我们会将这个登录禁用。

到这里就是对SpringSecurity的快速开始,接下来我们来看对权限的控制。

权限控制

实现UserDetails接口

SpringSecurity需要通过实现了UserDetails接口的类来判断用户登录和权限控制,我们要做的就是查询用户信息,然后封装成UserDetails对象并交给Security进行处理。

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;import java.util.Collection;public class SysUser implements UserDetails {private final String username;private final String password;private final Collection<? extends GrantedAuthority> authorities;public SysUser(String username, String password, Collection<? extends GrantedAuthority> authorities) {this.username = username;this.password = password;this.authorities = authorities;}@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return authorities;}@Overridepublic String getPassword() {return password;}@Overridepublic String getUsername() {return username;}@Overridepublic boolean isAccountNonExpired() {// 是否账号未过期return true;}@Overridepublic boolean isAccountNonLocked() {// 是否账号未锁定return true;}@Overridepublic boolean isCredentialsNonExpired() {// 是否凭据未过期return true;}@Overridepublic boolean isEnabled() {// 是否账号可用return true;}
}

添加SecurityConfig配置类

密码编码器:必须指定密码编码器,因为密码不允许明文存储。账号的密码为123abc,但存储的密码可不是123abc,而是经过编码后生成的一串字符串。

添加用户到内存:这里就直接添加用户到内存,正常是要保存在数据库里。道理其实是一样的,都是要提供给Security封装实现了UserDetails接口的类。

配置过滤器链:这个是很重要的配置,Security的扩展性很强,就是因为可以在这里配置各种自定义的设置。例如,我们可以配置自定义身份验证过滤器,从而替换默认的配置。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;@Configuration
@EnableWebSecurity
public class SecurityConfig {// 添加用户到内存@Beanpublic InMemoryUserDetailsManager inMemoryUserDetailsManager() {String password = "123abc";BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();String encode = bCryptPasswordEncoder.encode(password);SysUser sysUser = new SysUser("艾伦", encode,AuthorityUtils.commaSeparatedStringToAuthorityList("权限1,权限2"));return new InMemoryUserDetailsManager(sysUser);}// 密码编码器@Beanpublic BCryptPasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}// 配置过滤器链@Beanpublic SecurityFilterChain defaultSecurityFilterChain(HttpSecurity httpSecurity) throws Exception {// 关闭跨域漏洞防御httpSecurity.csrf(AbstractHttpConfigurer::disable);return httpSecurity.build();}
}

测试接口DemoController

我们编写两个接口,用来测试权限控制。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DemoController {@GetMapping("/test1")public String demo1() {System.out.println("test1访问成功!");return "test1访问成功!";}@GetMapping("/test2")public String demo2() {System.out.println("test2访问成功!");return "test2访问成功!";}
}

设置权限控制authorizeHttpRequests

我们的用户只有权限1和权限2,并没有权限3。也就意味着demo1接口我们能正常访问,而demo2接口会因为没有权限访问失败。

注意:这里要指定登录请求为/login,否则会被拒绝访问。

// 配置过滤器链
@Bean
public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity httpSecurity) throws Exception {httpSecurity.authorizeHttpRequests(authorizeHttpRequests -> authorizeHttpRequests.requestMatchers(HttpMethod.GET, "/test1").hasAnyAuthority("权限1", "权限2").requestMatchers(HttpMethod.GET, "/test2").hasAuthority("权限3"));httpSecurity.formLogin(formLogin -> formLogin.loginProcessingUrl("/login") // 登录请求);// 关闭跨域漏洞防御httpSecurity.csrf(AbstractHttpConfigurer::disable);return httpSecurity.build();
}

结果分析

结果就是/test1访问成功,而/test2因为没有权限访问失败。

/test1

/test2 

总结

这就是对SpringSecurity的初识,先做一个了解。要想在项目中整合SpringSecurity的话,还需要进一步学习,了解更深层的原理。 

《整合SpringSecurity》

https://blog.csdn.net/qq_74312711/article/details/134992609?spm=1001.2014.3001.5502

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/226627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XXE利用的工作原理,利用方法及防御的案例讲解

XXE&#xff08;XML外部实体注入&#xff09;利用是一种网络安全攻击手段&#xff0c;其中攻击者利用XML解析器处理外部实体的方式中的漏洞。这种攻击主要针对的是那些使用XML来处理数据的应用程序&#xff0c;尤其是当这些应用程序没有正确限制外部实体的处理时。通过XXE利用&…

【后端卷前端3】

侦听器 监听的数据是 data()中的动态数据~响应式数据 <template><div><p>{{showHello}}</p><button click"updateHello">修改数据</button></div> </template><script>export default {name: "goodsTe…

使用Python实现对word的批量操作

Python在平时写写小工具真是方便快捷&#xff0c;Pyhon大法好。以下所有代码都是找了好多网上的大佬分享的代码按照自己的需求改的。 调用的库为Python-docx、win32com、PyPDF2、xlwings&#xff08;操作excel&#xff09;。 因为公司的任务要对上千个word文件进行批量操作&a…

威联通硬盘休眠后修改系统定时任务

按照网上一些教程&#xff0c;成功将威联通的机械硬盘设置了自动休眠。但是发现每天有多个整点硬盘会自动唤醒&#xff0c;怀疑是系统内置的定时任务触发了硬盘唤醒。 通过查看系统日志中事件和访问记录&#xff0c;判断出一些引发硬盘唤醒的自动任务&#xff0c;将这些定时任…

mediapipe 的姿态检测遇到的问题

简介&#xff1a; 最近在用mediapipe 进行人体姿态检测&#xff0c;当我初始化pose&#xff08;姿态检测对象&#xff09;时出现了错误&#xff1a;报错如下&#xff1a; Downloading model to D:\Anaconda\envs\taiji\lib\site-packages\mediapipe/modules/pose_landmark/pos…

Hdfs java API

1.在主机上启动hadoop sbin/start-all.sh 这里有一个小窍门&#xff0c;可以在本机上打开8088端口查看三台机器的连接状态&#xff0c;以及可以打开50070端口&#xff0c;查看hdfs文件状况。以我的主虚拟机为例&#xff0c;ip地址为192.168.198.200&#xff0c;所以可以采用下…

DS八大排序之冒泡排序和快速排序

前言 前两期我们已经对"插入排序"&#xff08;直接插入排序和希尔排序&#xff09; 和 "选择排序"&#xff08;直接选择排序和堆排序&#xff09;进行了详细的介绍~&#xff01;这一期我们再来详细介绍一组排序 &#xff1a;"交换排序"即耳熟能…

TCPIP介绍

可见 TCP/IP 被分为 4 层&#xff0c;每层承担的任务不一样&#xff0c;各层的协议的工作方式也不一样&#xff0c;每层封装上层数据的方式也不一样&#xff1a; 应用层&#xff1a;应用程序通过这一层访问网络&#xff0c;常见 FTP、HTTP、DNS 和 TELNET 协议&#xff1b; 传输…

如何集成和使用Feign的远程调用

feign的简单介绍 Feign是一个声明式的http客户端&#xff0c;可以帮助我们优雅的实现http请求的发送 OpenFeign/feign: Feign makes writing java http clients easier (github.com)Spring Cloud OpenFeign 中文文档 (springdoc.cn)Spring Cloud OpenFeign在spring cloud的基础…

Reinfocement Learning 学习笔记PartⅡ

文章目录 Reinfocement Learning六、随机近似与随机梯度下降&#xff08;Stochastic Approximation & Stochastic Gradient Descent&#xff09;6.1 Robbins-Monro Algorithm6.2 随机梯度下降 七、时序差分方法&#xff08;Temporal-Difference Learning&#xff09;7.1 TD…

TSINGSEE青犀可视化视频云平台JT/T1078接入能力在智慧物流中的应用

一、引言 随着科技的快速发展和全球贸易的蓬勃发展&#xff0c;智慧物流成为了现代物流业的重要发展方向。智慧物流通过引入先进的信息技术&#xff0c;实现了物流过程的自动化、智能化和信息化&#xff0c;从而提高了物流效率和准确性。在这个过程中&#xff0c;JT/T1078接入…

魔众文库系统v5.7.0版本文件顺序选择,短信注册支持设置密码,前端界面升级

文件顺序选择&#xff0c;短信注册支持设置密码&#xff0c;前端界面升级 [新功能] 富文本支持文档一键导入&#xff0c;支持Word文档&#xff08;docx&#xff09;、Markdown文档&#xff08;md&#xff09; [新功能] 财务中心→全部订单新增"业务订单ID"筛选条件…

【Vue】elementUI表格,导出Excel

系列文章 【Vue】vue增加导航标签 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/134965353 【Vue】Element开发笔记 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/133947977 【Vue】vue&#xff0c;在Windows IIS平台…

Jmeter分布式性能测试,80%资深测试都会遇到这个坑!

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

【C语言】动态内存管理(C语言的难点与精华,数据结构的前置知识,你真的掌握了吗?)

文章目录 引言一、为什么要动态内存分配二、动态内存分配的相关函数2.1 malloc2.2 free2.3 calloc2.4 realloc 三、常见的动态内存的错误3.1 对NULL指针的解引用3.2 对动态内存越界访问3.3 对非动态内存释放3.4 对动态内存部分释放3.5 对动态内存多次释放3.6 未对动态内存释放&…

v-md-editor高级使用之自定义目录

​ 官方给出的目录设置参见&#xff1a;https://code-farmer-i.github.io/vue-markdown-editor/zh/senior/toc.html#%E7%9B%B8%E5%85%B3%E9%85%8D%E7%BD%AE ​ 在做实际使用中往往可能需要将目录结构独立出来&#xff0c;经过近一天的研究终于明白其实现逻辑&#xff0c;并将目…

3.qml 3D-Node类学习

Node类是在View3D 中的对象基础组件&#xff0c;用于表示3D空间中的对象&#xff0c;类似于Qt Quick 2D场景中的Item&#xff0c;介绍如下所示&#xff1a; 如上图可以看到&#xff0c;Node类的子类非常多&#xff0c;比如Model类(显示3D模型)、ParticleSystem3D粒子系统类、Li…

苹果计划将全球1/4的IPhone产能转移至印度

KlipC报道&#xff1a;据相关人士报道&#xff0c;苹果希望在未来2到3年内每年在印度生产超过5000万部iphone&#xff0c;要是该计划得以实现&#xff0c;印度将占领全球iPhone产量的四分之一。 KlipC的分析师Alex Su表示&#xff1a;“此次iPhone15推出是苹果印度制造计划的一…

认知能力测验,①如何破解数字推理类测试题?

校园招聘&#xff08;秋招春招&#xff09;&#xff0c;最为常见的认知能力测验&#xff0c;在线工具网将整理分析关于认知能力测验的系列文章&#xff0c;希望能帮助大家顺利通过认知能力测评&#xff0c;找到自己心仪的工作。 数字推理测试&#xff0c;是我们在求职中经常会…

C# 获取Windows所有窗口句柄

写在前面 在做录屏或截屏操作时&#xff0c;需要获取当前正在运行中的桌面程序句柄&#xff0c;在网上查找资源的的时候&#xff0c;发现了一个工具类还不错&#xff0c;这边做个验证记录。 参考代码 public class WindowApi{//寻找目标进程窗口 [DllImport("USER…