论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
四、Spring Boot集成Spring Security之认证流程 ...
四、Spring Boot集成Spring Security之认证流程
乌市泽哥
金牌会员
|
2024-10-14 11:07:36
|
来自手机
|
显示全部楼层
|
阅读模式
楼主
主题
895
|
帖子
895
|
积分
2685
二、概要说明
本文紧张介绍登录登出业务流程,所以使用基于内存的用户名暗码,暂不介绍授权相关内容,后续会详细介绍基于数据库的认证及授权
怎样查看基于内存的默认用户名暗码
怎样设置基于内存的自定义用户名暗码
本文与上文有强关联性,如果对过滤器链中登录相关的过滤器不熟悉的同砚,请先查看
三、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企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
乌市泽哥
金牌会员
这个人很懒什么都没写!
楼主热帖
是什么让.NET7的Min和Max方法性能暴增 ...
@RequestParam,@PathVariable两个注解 ...
7 行代码搞崩溃 B 站,原因令人唏嘘! ...
SqlServer远程连接
2019 第十届蓝桥杯大赛软件赛决赛,国 ...
聚焦企业开放OpenAPI痛难点,华为云API ...
想入行SAP咨询,最具性价比的方式 ...
活动 | 塑造软件新生态 赋能发展新变革 ...
CentOS7 安装 Redis 7.0.2
[WPF] 使用 HandyControl 的 CirclePan ...
标签云
存储
挺好的
服务器
快速回复
返回顶部
返回列表