SpringSecurity入门
简介
SpringSecurity 是Spring家族中的一个安全管理框架。相比于另一个安全框架 Shiro ,它提供了更丰富的功能,社区资源也比Shiro丰富。
一般来说中大型的项目都是使用 SpringSecurity 来做安全框架。小项目用 Shiro 的比较多,因为相比于 SpringSecurity , Shiro 的上手会更简单一些。
一般 Web 应用需要进行认证和授权。
- 认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户
- 授权:经过认证后判断当前用户是否有权限执行某个操作
而认证和授权也是SpringSecurity作为安全框架的核心功能。
1、快速入门
1.1、准备工作
首先搭建一个简单的SpringBoot工程
① 设置父工程,添加依赖
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.5.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
② 创建启动类
@SpringBootApplication
public class SecurityApplication {
public static void main(String[] args) {
SpringApplication.run(SecurityApplication.class, args);
}
}
③ 编写测试controller,启动服务器测试
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello";
}
}
④ 显示如下,准备工作完成
1.2、引入SpringSecurity
在 SpringBoot 项目中使用 SpringSecurity 我们只需要引入依赖即可实现入门案例。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
引入依赖后再次取尝试访问之前的接口(http://localhost:8080/hello),就会自动跳转到 SpringSecurity 的默认登陆页面,默认用户名是user,密码会输出在控制台
登录成功后,就可以进入到我们要访问的接口(http://localhost:8080/hello)
之后切换路径为:http://localhost:8080/logout,实现退出
2、认证
2.1、登录校验流程
核心是token
2.2、初步认识原理
想要知道如何实现自己的登录流程,就必须要先知道入门案例中的SpringSecurity的流程。
2.2.1、SpringSecurity完整流程
SpringSecurity 的原理其实就是一个过滤器链,内部包含了各种功能的过滤器,这里可以先看一下入门案例的过滤器。
-
UsernamePasswordAuthenticationFilter:负责处理我们在登录页面填写了用户名密码后的登录请求,入门案例的认证工作主要由它负责
-
ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeneidException 和 AuthenticationException
-
FilterSecurityInterceptor:负责权限校验的过滤器
2.2.2、认证流程详解(后续补充)
2.3、解决问题
2.3.1、思路分析
登录:
① 自定义登录接口,调用ProviderManager的方法进行认证,如果认证通过就生成jwt,把用户id作为key,用户信息作为value存入Redis中。
② 定义UserDetailsService,在这个实现类中去查询数据库。
校验:
① 定义jwt认证过滤器,需要获取token,解析token,获取其中的userId,之后从Redis中获取用户信息。
② 将用户信息存入SecurityContextHolder