4.认识SpringSecurity

简介: Spring Security 是 Spring 生态中的安全框架,核心功能包括认证(如表单、OAuth2、JWT等)与鉴权(URL、方法级、RBAC等),支持多种安全机制并可防御 CSRF 等攻击。其架构基于过滤器链,通过 `DelegatingFilterProxy` 与 `FilterChainProxy` 实现安全逻辑的灵活嵌入与多链管理,兼具扩展性与安全性。(238字)

https://docs.spring.io/spring-security/reference/index.html
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月前
|
资源调度 JavaScript 前端开发
前端组件库——Arco Design Vue知识点大全(一)
教程来源 https://bncne.cn/sheyingjiqiao.html Arco Design Vue是字节跳动开源的企业级Vue 3设计系统,源于抖音等亿级应用实践。聚焦设计一致性、开发提效与多端适配,具备60+高质量组件、全TypeScript支持、极致性能及可视化主题定制能力,已成为Vue 3生态中增长迅速的现代化UI解决方案。
|
6月前
|
人工智能 NoSQL 前端开发
Chap03. SpringAI
SpringAI整合多款主流大模型,支持对话、函数调用与RAG等架构,提供统一API简化开发。通过ChatClient封装交互,结合Prompt工程、工具调用与知识检索,可快速构建智能客服、哄哄模拟器、ChatPDF等应用,并支持多模态与持久化扩展,助力AI应用高效落地。
|
6月前
|
存储 算法 索引
二叉树基础及常见类型
二叉树是数据结构的核心,既是红黑树、堆、字典树等复杂结构的基础,也体现递归思维,贯穿回溯、动态规划等算法。掌握二叉树,等于掌握算法之魂。本文详解其类型、性质与实现,助你彻底精通。
|
6月前
|
算法 索引
双指针技巧秒杀七道数组题目
本文介绍数组与链表中常用的双指针技巧,包括快慢指针与左右指针。通过LeetCode经典题目如删除有序数组/链表中的重复项、两数之和等,详解如何用快慢指针实现原地修改,提升算法效率,适用于刷题进阶与面试备考。(238字)
|
6月前
|
算法
双指针技巧秒杀七道链表题目
本文总结单链表七大核心技巧:合并有序链表、链表分解、合并k个有序链表、找倒数第k个节点、找中点、判断环及环起点、判断两链表相交。巧妙运用双指针、虚拟头结点、快慢指针和优先队列等方法,助你高效解决经典链表算法题。
|
6月前
|
敏捷开发 Dubbo Java
需求开发人日评估
本文介绍敏捷开发中关键的工时评估——人日估算方法,涵盖开发、自测、联调、测试及发布各阶段周期参考,提供常见需求如增删改查、Excel导入导出、跨服务调用等典型场景的人日基准,助力团队科学规划迭代进度。
|
6月前
|
敏捷开发 Java 测试技术
为什么要单元测试
本文探讨单元测试如何让软件开发提速而非拖慢进度。通过解析测试体系演进、测试金字塔理念,阐述单元测试在提升调试效率、代码质量与研发效能方面的核心价值,揭示“写单测=踩刹车”的认知误区,倡导研发自主保障质量,推动项目高效持续交付。
|
6月前
|
存储 缓存 Java
自定义注解
本文介绍如何在Spring项目中实现自定义注解,结合AOP完成日志记录,并通过过滤器实现登录权限控制。涵盖注解定义、元注解说明、切面编程及实际应用场景,展示其在日志、验证、权限等场景的扩展用途,代码简洁,易于复用。(238字)
|
6月前
|
SQL 安全 关系型数据库
了解SQL注入
SQL注入是利用Web应用输入验证缺陷,将恶意SQL代码插入数据库查询的攻击方式,可导致身份绕过、数据泄露、篡改甚至系统被控。常见于登录框等用户输入场景,通过构造特殊字符串改变原有SQL逻辑。防御需结合输入验证、参数化查询及错误信息管控,从应用与网络层面综合防护。
|
6月前
|
SQL 前端开发 Java
ReadMe
这里整理了Java微服务相关的知识笔记,涵盖入职必备、源码分析、真实项目与大厂面试实录。适合有Java基础、备战微服务进阶的开发者。持续更新中,欢迎催更、指正,点赞支持哦~一起冲击梦想公司!