认识SpringSecurity

简介: SpringSecurity是Spring生态中的核心安全框架,提供全面的认证与鉴权功能。支持表单、OAuth2、JWT、CAS等多种认证方式,并可通过扩展支持自定义鉴权逻辑。基于过滤器链实现,通过FilterChainProxy集成到Web容器中,支持多安全过滤链、动态权限控制及RBAC模型。内置CSRF、会话固定等攻击防护机制,结合ExceptionTranslationFilter统一处理安全异常,保障应用安全稳定。

1-SpringSecurity核心功能
1.认证
什么是认证:
SpringSecurity作为一款成熟的鉴权框架,目前支持的认证机制非常的全,这里我们可以简单了解一下:
● 表单认证
● OAuth2.0认证
● SAML2.0认证
● CAS认证
● RememberMe 自动认证
● JAAS认证
● OpenID 去中心化认证
● X509认证
● Http Basic认证
● Http Digest认证
而SpringSecurity不仅可以支持上面的认证机制,还可以通过引入第三方依赖支持更多认证方式,同时也允许用户自定义认证逻辑(这个我们后面会讲)。
2.鉴权
基于上面的多种认证方式(实际那种认证都不影响鉴权),SpringSecurity支持基于URL的请求授权、方法访问授权、支持SPEL表达式访问控制、支持ACL自定义对象安全,同时支持动态授权配置、支持RBAC权限模型,简单一句话:基本没有SpringSecurity做不了的鉴权。
3.其他
除了熟知的认证、授权两个核心功能,SpringSecurity还可以自动防御很多网络攻击,如CSRF攻击等,可参照:
https://www.yuque.com/yzxb/index/py8ihz2gghkcaht0
2-SpringSecurity核心架构
SpringSecurity的种种功能,都是基于过滤器实现的,这些过滤器根据默认或用户指定的顺序(@Order注解或实现Ordered接口)排列,形成一个过滤器链。
1.过滤链
SpringSecurity的功能实现关键就是依赖过滤器链
Spring Security 的 Servlet 支持是基于 Servlet Filter 的,因此首先大致了解一下 Filter 的作用是有帮助的。下图显示了单个 HTTP 请求的处理程序的典型分层:

客户端(广义的前端)向应用程序(广义的后端)发送请求,容器根据请求URI路径创建FilterChain,其中包含应处理 HttpServletRequest的 Filter实例和 Servlet(可以简单理解就是一个运行的tomcat容器、WebLogic容器)。在 SpringMVC 应用程序中,Servlet 是 DispatcherServlet 的实例。一个 Servlet 最多可以处理一个 HttpServletRequest 和 HttpServletResponse。大致实现代码如下:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// do something before the rest of the application
chain.doFilter(request, response); // invoke the rest of the application
// do something after the rest of the application
}
2.委托过滤代理
如果用户需要注册自己的过滤器标准,就可以采用委托过滤处理
Spring 提供了一个Filter名为 的实现DelegatingFilterProxy,允许在 Servlet 容器的生命周期和 Spring 的ApplicationContext。Servlet容器允许Filter使用自己的标准注册实例。您可以借助DelegatingFilterProxy通过标准 Servlet 容器机制进行注册,但将所有工作委托给实现Filter。

DelegatingFilterProxy从查找Bean Filter ApplicationContext然后调用Bean Filter,大致实现代码:
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) {
// 1-延迟获取注册为 Spring Bean 的 Filter
Filter delegate = getFilterBean(someBeanName);
// 2-将工作委托给 Spring Bean
delegate.doFilter(request, response);
}
3.过滤器链代理
SpringSecurity的过滤器链是通过FilterChainProxy嵌入到Web项目的原生过滤器链中
Spring Security 的 Servlet 支持包含在FilterChainProxy。FilterChainProxy是 Spring Security 提供的特殊功能Filter,允许Filter通过 委托给许多实例SecurityFilterChain。由于FilterChainProxy是一个 Bean,因此它通常包装在DelegatingFilterProxy中。

简单来说:SpringSecurity的过滤器链是通过FilterChainProxy嵌入到Web项目的原生过滤器链中。而这样的过滤链也不止一个,形如下面的安全过滤链中的图示,右侧就为我们展示了多个过滤链情况。
4.安全过滤链
过滤器链也会有多个,如请求URI:/user/和/admin/就可以是两个过滤器链,对应下图右侧
SecurityFilterChainFilterChainProxy 使用它来确定Filter应为当前请求调用哪些 Spring Security 实例。

下图显示了多个SecurityFilterChain实例

5.处理安全异常
允许将和ExceptionTranslationFilter转换为 HTTP 响应。AccessDeniedExceptionAuthenticationException
ExceptionTranslationFilter作为安全过滤器之一插入FilterChainProxy中。
ExceptionTranslationFilter下图展示了与其他组件的关系:

● 首先,ExceptionTranslationFilter调用FilterChain.doFilter(request, response)应用程序的其余部分。
● 如果用户未经过身份验证或者是AuthenticationException,则开始身份验证。
○ SecurityContextHolder被清除。
○ HttpServletRequest保存后,以便在身份验证成功后可用于重放原始请求。
○ 用于AuthenticationEntryPoint向客户端请求凭据。例如它可能会重定向到登录页面或发送WWW-Authenticate标头。
● 否则,如果它是AccessDeniedException,则Access Denied。调用AccessDeniedHandler来处理拒绝访问。

相关文章
|
2月前
|
SQL 缓存 Java
汇总
MyBatis配置优先级:方法参数 > resource/url > properties体内。支持多环境、事务管理(JDBC/MANAGED)、XML映射(一对一、一对多、多对多)及分页(逻辑与物理)。提供一级、二级缓存,三种执行器,支持拦截器扩展与批量操作优化。
|
2月前
|
Linux 数据安全/隐私保护 虚拟化
虚拟机安装(CentOS7)
准备CentOS7镜像及VMware Workstation工具,可使用提供的百度云链接下载。通过VMware创建虚拟机,参考指定教程完成安装,默认用户名为root,密码由用户自设。确保电脑满足运行需求。(236字符)
|
9月前
|
机器学习/深度学习 数据采集 安全
MiMo-7B:从预训练到强化学习,解锁语言模型的推理潜能
目前,大多数成功的 强化学习 工作,包括开源研究,都依赖于相对较大的基础模型,例如 32B 模型,特别是在增强代码推理能力方面。业内普遍认为在一个小模型中同时提升数学和代码能力是具有挑战性的。然而,小米MiMo研究团队相信 RL 训练的推理模型的有效性取决于基础模型固有的推理潜力。为了完全解锁语言模型的推理潜力,不仅需要关注后训练,还需要针对推理定制预训练策略。
658 43
|
2月前
|
XML JSON Java
映射关系
MyBatis中通过resultMap实现关联映射:一对一使用`<id>`和`<result>`;一对多在“一”方用`<collection>`映射集合;多对一用`<association>`关联对象;多对多需借助中间类,双方均用`<collection>`维护关系,实现复杂数据结构的精准映射。(238字)
|
2月前
|
敏捷开发 Java 测试技术
为什么要单元测试
本文探讨单元测试如何让软件开发“提速”而非“踩刹车”。从测试体系演进出发,解析测试金字塔理念,阐明单元测试在提升代码质量、调试效率、重构信心和研发效能方面的核心价值,助力项目长期高效迭代。
|
监控 安全 网络安全
深入解析PDCERF:网络安全应急响应的六阶段方法
PDCERF是网络安全应急响应的六阶段方法,涵盖准备、检测、抑制、根除、恢复和跟进。本文详细解析各阶段目标与操作步骤,并附图例,助读者理解与应用,提升组织应对安全事件的能力。
1961 89
|
计算机视觉 网络架构
【YOLOv10改进-特征融合】YOLO-MS MSBlock : 分层特征融合策略
YOLOv10专栏介绍了YOLO-MS,一个优化多尺度目标检测的高效框架。YOLO-MS通过MS-Block和异构Kernel选择提升性能,平衡了计算复杂度与准确性。它在不依赖预训练的情况下,在COCO上超越同类模型,如YOLO-v7和RTMDet。MS-Block包含不同大小卷积的分支,用于增强特征表示。代码示例展示了MSBlock类的定义,用于处理不同尺度特征。该模块可应用于其他YOLO模型以提升性能。更多详情和配置参见相关链接。
|
8月前
|
搜索推荐 Linux iOS开发
qBittorrent:专业级磁力种子下载工具,高速稳定 + 全功能资源管理
qBittorrent 是一款免费、开源且无广告的 P2P BitTorrent 客户端,支持 Windows、Mac 和 Linux 系统。它功能强大,包含 DHT、Peer Exchange、加密等技术,支持下载优先级设置、RSS 订阅和远程控制。用户可通过 Torrent 文件或磁力链接下载资源,并能优化连接设置以提升速度。常见问题如“元数据下载”或 DHT 连接不佳时,建议使用热门种子或调整 trackers。
7442 0
|
机器人 Python
while`循环
`Python`的`while`循环在条件为真时重复执行代码块。常见用法包括:固定次数循环、无限循环(可由外部条件退出)、使用`break`和`continue`控制流程,以及等待条件满足。经典应用案例有模拟登录尝试、读取文件至末尾和实现简单聊天机器人。`while`循环适用于处理不确定次数迭代和条件触发场景。
500 2
|
缓存 Python
Python中递归错误
【7月更文挑战第17天】
414 8