注解的使用
- 在使用SpringSecurity的注解之前,需要开启注解功能,可以选择在启动类上或配置类上添加
@EnableGlobalMethodSecurity(securedEnabled = true)
,表示开启了@Secured
注解的功能
1 |
|
@Secured
- 该注解在Controller类上或方法上添加,表示进入该控制器或者方法需要什么角色,需要注意的是角色需要加“ROLE_”前缀。注意,它只能用于角色认证。
- 注释掉配置类中的
hasRole
和hasAnyRole
方法,然后在控制器上添加@Secured
注解。
1 |
|
@PreAuthorize
使用该注解之前需要在配置类中的
@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true)
,prePostEnabled设置为true表示开启@PreAuthorize
、@PostAuthorize
、@PreFilter
和@PostFilter
功能。该注解在Controller类上或方法上添加,在里面可以加入
hasRole
、hasAuthority
等认证权限的方法,表示进入该控制器或者方法之前需要什么权限。该注解可以认证角色和权限。注释掉配置类中的
hasAuthority
和hasAnyAuthority
方法,把@Secured
注解注释掉,然后在控制器的方法上添加@PreAuthorize
注解。
1 |
|
@PostAuthorize
- 同样也需要在配置类中开启注解功能,prePostEnabled设置为true。
- 该注解在Controller类上或方法上添加,在里面可以加入
hasRole
、hasAuthority
等认证权限的方法,表示该控制器或者方法执行之后需要什么权限。该注解可以认证角色和权限。
1 |
|
@PreFilter
同样也需要在配置类中开启注解功能,prePostEnabled设置为true。
该注解表示在进入控制器的方法之前对数据进行过滤。该注解用得比较少,只作简单说明
1 | "getTestPreFilter") ( |
@PostFilter
同样也需要在配置类中开启注解功能,prePostEnabled设置为true。
该注解表示在控制器的方法执行之后对数据进行过滤。该注解用得比较少,只作简单说明
1 | "getAll") ( |
用户注销
- 只需要在配置类中添加登出的url和登出成功后跳转的地址就可以了。
1 |
|
RememberMe功能
- 以前记住我的功能的实现,是把登录的状态会保存到一个cookie中,存放在浏览器中,当下一次需要登录时,或者打开一个新的浏览器进行登录,会提前判断浏览器中是否有该用户的cookie,如果有就免登录。使用cookie技术有一个缺点就是如果cookie中有敏感信息,就可能导致泄密。
实现原理
- SpringSecurity实现记住我功能和cookie技术不同,它是不会泄露敏感信息的,它的实现过程如下:
- 首先,如果通过浏览器认证成功,security会将一个存有加密串的cookie存放到浏览器中
- 与此同时,也将加密串和对应的用户信息字符串存储到数据库,这个可以在
PersistentTokenRepository
类中看到 - 再次访问时,security会获取到浏览器的cookie信息到数据库中进行比对,如果查询到对应的信息则认证成功,可以直接登录,否则,认证失败。
实现
- 首先,实现基于数据库的记住我功能,需要添加springboot关于jdbc的依赖
1 | <dependency> |
- 实现基于数据库的记住我功能,需要创建一张表。其实,如果没有创建该表,SpringSecurity也会帮我们创建。
1 | CREATE TABLE `persistent_logins` ( |
- 添加数据库的配置文件
1 | spring: |
- 然后在配置类中注入数据源对象,并创建一个实现
PersistentTokenRepository
接口的实现类的对象。
1 | public class SecurityConfig extends WebSecurityConfigurerAdapter { |
- 在login.html中添加复选框
1 |
|
- 运行项目,查看效果。