文章总结自三更草堂SpringSecurity框架教程,个人认为是B站最好用的Security+JWT讲解。
1. 项目搭建
1.1 新建SpringBoot项目
SpringBoot使用的是2.7.0版本
依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
创建一个HelloController
:
@RestController
@RequestMapping("/hello")
public class HelloController {
@GetMapping
public String hello(){
return "hello";
}
}
访问测试:可以看到可以访问成功
1.2 引入SpringSecurity依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
重启项目之后发现localhost:8088/hello
接口无法再次进行访问,取而代之的是Security的登录页。
此时的默认用户名是user
,密码会在控制台输出。
2. 认证
2.1 登录流程
2.2 security认证流程
本质使用的是过滤器链,内部提供各种功能的过滤器。
-
核心过滤器:
UsernamePasswordAuthenticationFilter
:处理登录页中的登录请求;ExceptionTranslationFilter
:处理过滤器链中的异常;FilterSecurityInterceptor
:权限校验过滤器。
-
1.2案例认证流程:
Authentication
:实现类,表示当前访问系统的用户,封装了相关用户信息;AuthenticationManager
:定义认证Authentication
方法;UserDetailsService
:加载用户特定数据的核心接口;包含一个根据用户名查询用户信息的方法。UserDetails
:提供核心用户信息,通过UserDetailsService
根据用户名获取处理的用户信息封装成UserDetailsService
对象返回,然后将信息封装到Authentication
对象中。
2.3 实现思路
使用自己定义的接口去掉哟SpringSecurity中封装的类。
-
登录流程:
-
校验过程:
-
引入redis:如果认证之后害需要通过JWT中的
userid
对数据库进行查询,消耗太大,可以存储入到redis中。
2.4 实现方案
- 登录:
- 自定义登录接口:调用
ProviderManager
的方法进行认证;认证通过生成JWT;将用户信息存入redis;
- 自定义登录接口:调用