Spring Security是针对Spring项目的安全框架,也是Spring Boot底层安全模块的默认技术选型,仅需引入spring-boot-starter-security模块,进行少量配置,即可实现强大的Web安全控制。
Spring Security的两个主要目标是认证和授权(访问控制)
官方文档:https://docs.spring.io/spring-security/site/docs/5.2.0.RELEASE/reference/htmlsingle/
- JDK:1.8
- Spring Boot:2.7.18
Spring Boot 版本升级为2.7.18,专栏中其他Spring Boot相关环境同步升级
启动服务,浏览器访问 127.0.0.1:8090/user/query,页面自动跳转到授权登录页
默认用户名为user,控制台上会打印默认密码,默认密码每次启动服务都会刷新
登录成功后,就可以正常访问了
该部分会使用到Spring Security的几个关键类,如下:
- WebSecurityConfigurerAdapter 自定义Security策略
- AuthenticationManagerBuilder 自定义认证策略
- @EnableWebSecurity 开启WebSecurity模式
3.3.1 编写UserDetailsService实现类
这里我们就直接固定写死用户名和密码,实际生产中可以从数据库中获取
3.3.2 编写配置类
分别测试,都通过
实际生产中,需要根据用户角色的权限来控制可访问的页面、可执行的操作等
level-1.html
level-2.html
level-3.html
index.html
**hasRole()和hasAuthority()**用法是类似的,只不过hasRole()方法会给自定义的角色名前加上 ROLE_ 前缀
因此在自定义用户时,如果使用**authorities()给用户设置角色时,需要自行添加上ROLE_**前缀。
roles()和authorities()设置的角色或权限,最终都存放在authorities参数中,且这两个方法会互相覆盖彼此的值。
浏览器访问
依次点击等级1、等级2、等级3,均自动跳转到授权登录页面,登录对应权限的用户后,可成功访问。
其中,登录admin用户,无法访问任何页面,登录admin0,可访问所有页面
登录权限不匹配的用户,拒绝访问
UserDetailsServiceImpl
SecurityConfig
浏览器访问,测试,通过
可控制用户认证访问接口
校验用户具有某个角色,才可访问接口
需在启动类开启注解
然后在接口方法上配置注解
在进入方法前校验用户具有某个权限或角色
需在启动类开启注解
然后在接口方法上配置注解
在进入方法后校验用户具有某个权限或角色
需在启动类开启注解
然后在接口方法上配置注解
校验权限后对数据进行过滤,只返回满足条件的数据
新建实体类
然后在方法上加上注解
测试,权限验证通过后
校验权限后对数据进行过滤,只有满足条件的数据才能传入接口方法中
测试,权限验证通过后
配置类中开启记住我
启动服务,访问页面,登录页面增加了记住我选择框
登录成功后,cookie中已保存用户信息,默认时间为2周
其他两个页面做相同修改
启动服务,登录成功后点击注销按钮,注销成功,返回首页,访问页面需再次登录
这里,自定义登录,默认用户参数是username,默认密码参数是password,默认记住我参数是remember-me,如果需要自定义登录表单的参数,做如下修改
启动服务,访问地址,跳转到自定义登录页
启动服务,浏览器访问,登录无权限用户后提示