论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
六、Spring Boot集成Spring Security之前后分离认证流程 ...
六、Spring Boot集成Spring Security之前后分离认证流程最佳方案 ...
渣渣兔
金牌会员
|
2024-11-6 13:42:45
|
显示全部楼层
|
阅读模式
楼主
主题
980
|
帖子
980
|
积分
2940
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
二、Spring Security默认认证流程及其优缺点
1、Spring Security默认认证流程总结
四、Spring Boot集成Spring Security之认证流程
详细介绍了认证流程,其焦点流程如下
SecurityContextPersistenceFilter:chain.doFilter()前从安全上下文仓库中获取安全上下文,未登录状态时获取未认证的安全上下文;chain.doFilter()后从安全上下文持有者中获取安全上下文并更新到安全上下文仓库中
LogoutFilter:如果是登出请求,清除安全上下文认证信息并重定向到登录页面,否则不处理
UsernamePasswordAuthenticationFilter:如果是登录请求,校验请求参数中的用户名密码,校验成功后天生新的已认证的安全上下文并保存到安全上下文仓库中后重定向到目标URL,否则不处理
DefaultLoginPageGeneratingFilter:如果是登录页面请求,返回默认登录页面,否则不处理
DefaultLogoutPageGeneratingFilter:如果是登出页面请求,返回默认登出页面,否则不处理
2、优缺点
提供了完整的安全的认证流程
默认基于session实现非前后分离项目的认证流程,该流程已经慢慢退出历史舞台
未提供前后分离认证流程
三、前后分离项目认证思绪
1、前后分离项目认证流程(基于默认流程优化)
前端输入用户名密码提交到后端
后端获取到用户名密码并校验,校验成功后天生token(类似于sessionId)返回给前端,天生已认证的安全上下文(类似于session)存储到安全上下文仓库中
前端获取到token,后续每次请求的请求头中都携带该token(类似于cookie)
后端获取请求头中的token,通过token获取安全上下文,并设置到安全上下文持有者中
前端提交退出请求时,后端获取请求头中的token,并通过token删除安全上下文仓库中安全上下文
2、前后分离项目认证流程关键组件对应的默认实现
从前后分离项目认证流程可以看出有四个关键组件
每次请求时通过请求头中token从安全上下文仓库中获取安全上下文的过滤器(默认SecurityContextPersistenceFilter)
登出时通过请求头中的token从安全上下文仓库中清除安全上下文的过滤器(默认LogoutFilter)
登录时验证用户名密码并天生token和安全上下文,将安全上下文添加到安全上下文仓库中的过滤器(默认UsernamePasswordAuthenticationFilter)
安全上下文仓库(默认HttpSessionSecurityContextRepository)
3、默认实现的局限性
UsernamePasswordAuthenticationFilter从form表单中获取请求参数,不符合RESTFUL开发规范
认证的关键组件AuthenticationManager未注入到Spring容器中,导致自定义认证过滤器无法直接从Spring容器中获取
UsernamePasswordAuthenticationFilter只实现了认证部分,认证成功后天生的安全上下文并添加安全上下文仓库中过程无法控制,只能使用默认的HttpSession或RequestAttributes方式,无法自定义
4、整改思绪
自定义SecurityContextRepositoryImpl实现安全上下文仓库SecurityContextRepository,实现基于分布式缓存的安全上下文仓库
自定义RestfulUsernamePasswordAuthenticationFilter继承AbstractAuthenticationProcessingFilter,实现符合RESTFUL开发规范的登录方式
自定义UserDetailsImpl实现UserDetails接口,方便添加自定义属性
自定义UserDetailsServiceImpl实现UserDetailsService接口,实现基于数据库的认证方式,并天生token设置到UserDetails中
5、整改后的认证流程
前端输入用户名密码提交到后端
后端AbstractAuthenticationProcessingFilter调用子类RestfulUsernamePasswordAuthenticationFilter的attemptAuthentication方法获取认证信息
RestfulUsernamePasswordAuthenticationFilter获取请求中的用户名密码,并调用UserDetailsService的loadUserByUsername获取用户信息
UserDetailsServiceImpl通过用户名查询用户,将用户信息设置到创建的UserDetailsImpl对象中,天生token设置到UserDetailsImpl对象中
AbstractAuthenticationProcessingFilter调用SecurityContextRepositoryImpl保存安全上下文
SecurityContextRepositoryImpl获取安全上下文及其认证信息中的token,将token和安全上下文添加到分布式缓存中
将token返回到前端
前端获取token,每次请求时都在请求头中携带该token
SecurityContextPersistenceFilter/SecurityContextHolderFilter调用SecurityContextRepositoryImpl的loadContext获取安全上下文
SecurityContextRepositoryImpl获取请求头中token,使用token从分布式缓存中获取安全上下文并返回
前端提交登出请求
LogoutFilter调用SecurityContextRepositoryImpl的saveContext,其中参数安全上下文为空值安全上下文
SecurityContextRepositoryImpl判断出空值安全上下文,获取请求头中的token,使用token删除分布式缓存中获取安全上下文
四、总结
1、设计前后分离项目认证流程原则
尽可能贴合原生Spring Security处理流程,尽量使用Spring Security提供的组件
接口设计符合RESTFUL接口规范
使用分布式缓存存储登录凭证,更适合分布式项目
2、其他说明
这里说的前后分离项目认证流程最佳方案,是个人认为的最佳方案,并非行业公认的最佳方案,一千个读者就有一千个哈姆雷特,欢迎在批评区或者私信讨论你心中的最佳方案
下文代码实现该方案,敬请等待
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
渣渣兔
金牌会员
这个人很懒什么都没写!
楼主热帖
SqlServer2012升级到SqlServer2016
事务的ACID特性
DCM: 中间件家族迎来新成员
深度干货!一篇Paper带您读懂HTAP | St ...
iOS事件传递链与响应链
(内附源码)Node.js小试——使用Node ...
arthas使用介绍
SaaS软件工程师成长路径
.NET for Apache Spark 入门演练
go-zero单体服务使用泛型简化注册Handl ...
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
Mysql
DevOps与敏捷开发
分布式数据库
移动端开发
程序人生
网络安全
.Net
SQL-Server
快速回复
返回顶部
返回列表