ToB企服应用市场:ToB评测及商务社交产业平台
标题:
四、Spring Boot集成Spring Security之认证流程
[打印本页]
作者:
乌市泽哥
时间:
2024-10-14 11:07
标题:
四、Spring Boot集成Spring Security之认证流程
二、概要说明
本文紧张介绍登录登出业务流程,所以使用基于内存的用户名暗码,暂不介绍授权相关内容,后续会详细介绍基于数据库的认证及授权
怎样查看基于内存的默认用户名暗码
怎样设置基于内存的自定义用户名暗码
本文与上文有强关联性,如果对过滤器链中登录相关的过滤器不熟悉的同砚,请先查看
三、Spring Boot集成Spring Security之securityFilterChain过滤器链详解
三、基于内存的用户名暗码
1、默认用户名暗码
一、Spring Boot集成Spring Security之自动装配
中第六节已介绍当用户未自定义认证接口时,生成默认认证接口inMemoryUserDetailsManager,此中用户名为user,暗码为随机生成的uuid,项目启动时会打印在控制台中
用户名暗码源码
2、自定义用户名暗码
上一小节【用户名暗码源码】中设置绑定可以设置自定义用户名、暗码
通过设置文件设置用户名暗码
3、为方便测试添加测试接口TestController
package com.yu.demo.web;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping("/hello")
public String hello() {
return "success";
}
}
复制代码
四、登录登出紧张概念介绍
安全上下文堆栈(SecurityContextRepository):用于存储安全上下文,默认基于session实现(HttpSessionSecurityContextRepository)
安全上下文持有者(SecurityContextHolder):用于存储本次请求的安全上下文,默认基于ThreadLocal实现
安全上下文(SecurityContext):用于存储认证信息
认证信息(Authentication):用于存储用户及认证结果信息,紧张实现类有
用户名暗码认证Token:UsernamePasswordAuthenticationToken
匿名认证Token:AnonymousAuthenticationToken
登录页面请求:跳转到登录页面的请求
登录请求:在登录页面输入用户名暗码后提交的请求
登出页面请求:跳转到登出页面的请求
登出请求:在登出页面确认登出提交的请求
五、登录业务逻辑
1、登录业务相关过滤器
SecurityContextPersistenceFilter
UsernamePasswordAuthenticationFilter
DefaultLoginPageGeneratingFilter
AnonymousAuthenticationFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
2、访问业务请求处理流程
1)、访问业务请求地点被拦截,重定向到登录页面请求
欣赏器访问业务请求地点:
http://localhost:8080/test/hello
SecurityContextPersistenceFilter处理请求:
从安全上下文堆栈中获取安全上下文为空,创建没有认证信息的安全上下文(SecurityContextImpl)
将第1步中获取的安全上下文设置到安全上下文持有者中
实验后续过滤器链
源码
AnonymousAuthenticationFilter处理请求:
获取安全上下文持有者中的安全上下文中的认证信息为空
创建匿名认证信息
创建新的没有认证信息的安全上下文
将第2步中的匿名认证信息设置到第3步中的安全上下文中
将第3步中的安全上下文中设置到安全上下文持有者中
实验后续过滤器链
源码
FilterSecurityInterceptor处理请求:
验证安全上下文持有者中的安全上下文中的匿名认证信息通过
验证授权信息失败(业务请求地点未设置可以匿名访问时),抛出AccessDeniedException异常
源码
ExceptionTranslationFilter处理请求:
捕获FilterSecurityInterceptor抛出的AccessDeniedException异常
判断是由于匿名访问导致的授权异常
创建新的没有认证信息的安全上下文
将第3步中的安全上下文中设置到安全上下文持有者中
重定向到登录页面:
http://localhost:8080/login
源码
SecurityContextPersistenceFilter处理请求:
实验chain.doFilter之后的代码
获取安全上下文持有者中的安全上下文
删除安全上下文持有者中的安全上下文
将第2步中获取的安全上下文保存到安全上下文堆栈中
源码
重定向登录页面请求:
http://localhost:8080/login(GET)
2)、重定向定页面请求,返回登录页面
SecurityContextPersistenceFilter处理请求:
从安全上下文堆栈中获取安全上下文为空,创建没有认证信息的安全上下文(SecurityContextImpl)
将第1步中获取的安全上下文设置到安全上下文持有者中
实验后续过滤器链
源码(同上)
DefaultLoginPageGeneratingFilter处理请求:
判断是跳转到登录页面的请求
生成默认登录页面
返回并渲染生成的默认登录页面
源码
SecurityContextPersistenceFilter处理请求:
实验chain.doFilter之后的代码
获取安全上下文持有者中的安全上下文
删除安全上下文持有者中的安全上下文
将第2步中获取的安全上下文保存到安全上下文堆栈中
源码(同上)
3)、输入正确用户名暗码,重定向到业务请求
SecurityContextPersistenceFilter处理请求:
从安全上下文堆栈中获取安全上下文为空,创建没有认证信息的安全上下文(SecurityContextImpl)
将第1步中获取的安全上下文设置到安全上下文持有者中
实验后续过滤器链
源码(同上)
UsernamePasswordAuthenticationFilter处理请求:
判断需要认证(AbstractAuthenticationProcessingFilter.doFilter方法)
认证用户名暗码乐成,生成已认证的认证信息UsernamePasswordAuthenticationToken
创建新的没有认证信息的安全上下文
将第2步中的认证信息设置到第3步中的安全上下文中
将第3步中的安全上下文设置到安全上下文持有者中
将第3步中的安全上下文保存到局部变量安全上下文堆栈中(空实现)
重定向到业务请求地点:
http://localhost:8080/test/hello
源码
SecurityContextPersistenceFilter处理请求:
实验chain.doFilter之后的代码
获取安全上下文持有者中的安全上下文
删除安全上下文持有者中的安全上下文
将第2步中获取的安全上下文保存到安全上下文堆栈中
源码(同上)
4)、重定向到业务请求
SecurityContextPersistenceFilter处理请求:
从安全上下文堆栈中获取已认证的安全上下文
将第1步中获取的安全上下文设置到安全上下文持有者中
实验后续过滤器链
源码(同上)
FilterSecurityInterceptor处理请求:
验证安全上下文持有者中的安全上下文中的认证信息通过
验证授权乐成
调用接口返回数据
源码
SecurityContextPersistenceFilter处理请求:
实验chain.doFilter之后的代码
获取安全上下文持有者中的安全上下文
删除安全上下文持有者中的安全上下文
将第2步中获取的安全上下文保存到安全上下文堆栈中
源码(同上)
六、登出业务实现逻辑
1、登出业务相关过滤器
SecurityContextPersistenceFilter
LogoutFilter
DefaultLogoutPageGeneratingFilter
2、访问登出页面请求处理流程
欣赏器访问登出请求地点:
http://localhost:8080/logout
SecurityContextPersistenceFilter处理请求:
从安全上下文堆栈中获取已认证的安全上下文
将第1步中获取的安全上下文设置到安全上下文持有者中
实验后续过滤器链
源码(同上)
DefaultLogoutPageGeneratingFilter处理请求:
判断是跳转到登出页面的请求
生成默认登出页面
返回并渲染生成的默认登出页面
源码
SecurityContextPersistenceFilter处理请求:
实验chain.doFilter之后的代码
获取安全上下文持有者中的安全上下文
删除安全上下文持有者中的安全上下文
将第2步中获取的安全上下文保存到安全上下文堆栈中
源码(同上)
3、登出页面确认登出请求处理流程
1)、确认登出,重定向到登录页面请求
SecurityContextPersistenceFilter处理请求:
从安全上下文堆栈中获取已认证的安全上下文
将第1步中获取的安全上下文设置到安全上下文持有者中
实验后续过滤器链
源码(同上)
LogoutFilter处理请求:
判断是登出请求
获取安全上下文持有者中的安全上下文
登出处理器处理登出业务
删除安全上下文持有者中的安全上下文
创建没有认证信息的安全上下文
将第2步中的安全上下文保存到安全上下文堆栈中
重定向到登录页面
源码
SecurityContextPersistenceFilter处理请求:
实验chain.doFilter之后的代码
获取安全上下文持有者中的安全上下文
删除安全上下文持有者中的安全上下文
将第2步中获取的安全上下文保存到安全上下文堆栈中
源码(同上)
2)、登录页面请求
第五节登录业务逻辑已介绍,不再赘述。
七、说明
Spring Boot集成Spring Security默认是非前后分离架构
本文介绍的流程是非前后分离版本的处理流程
前后分离处理流程较为简单
未认证时访问业务接口,返回未认证错误信息
调用登录接口乐成后返回Token,此后请求头中携带此Token
调用登出接口乐成后返回乐成,后端将该Token失效
携带Token访问业务接口,后端验证Token乐成后,调用业务接口并返回数据
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4