正文
在项目开发过程中,会涉及到安全框架的配置。其中常用的就是 shiro 和
spring-security
,在本文中将介绍
spring-security
的工作流程和实践应用,并基于此总结其使用心得和项目配置关键。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
-
项目地址:https://github.com/YunaiV/ruoyi-vue-pro
-
视频教程:https://doc.iocoder.cn/video/
如上图所示,一个请求在达到控制器之前,会经过一系列的过滤器
DefaultSecurityFilterChain
,绿色的部分负责用户认证,蓝色的部分处理认证异常的情况,橙色的部分负责用户的授权,最终请求到控制器的方法。在认证完成之后,会将用户认证的结果
Authentication
放进
SecurityContextHolder
中,从中可以获取到用户信息。
在开始之前,需要先介绍一下其他重要的组件
-
SecurityContextHolder:
存放身份信息的容器
-
Authentication:
用户信息的抽象即 security 的认证主体
-
AbstractAuthenticationToken:
authentication
即认证主体的抽象类,
-
AuthenticationManager:
身份认证器接口,具体实现类为
ProviderManager
-
AuthenticationProvider:
用来处理
authentication
的认证信息
-
AuthenticationSuccessHandler
认证成功处理器
-
AuthenticationFailureHandler
认证失败处理器
认证的流程如下所示:
1、用户请求的接口经过 security 过滤器,按照其登录方式适配的
authentication
封装其认证方法,通过
AuthenticationProvider
来进行处理认证。获取身份信息会按照其配置provider的顺序来处理。
2、通常情况下将身份信息封装到封装成
Authentication
下的实现类
UsernamePasswordAuthenticationToken
, 通常是用户密码的登录方式。
3、通过
AuthenticationManager
身份管理器,通过其配置的provider 验证这个
UsernamePasswordAuthenticationToken
的信息。
4、认证逻辑一般是在 service 中,认证成功之后会返回认证信息,
AuthenticationManager.authentication
身份管理器返回一个
Authentication
实例(上下文中包含权限信息,身份信息,细节信息,但是密码会被移除)。
5、
SecurityContextHolder
上下文容器会填充
UsernamePasswordAuthenticationToken
信息,通过