SpringSecurity核心架构

简介: Spring Security基于过滤器链实现安全控制,核心为FilterChainProxy,通过DelegatingFilterProxy集成到容器。多SecurityFilterChain按请求路径匹配,ExceptionTranslationFilter处理认证与授权异常,实现细粒度访问控制。(238字)

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来处理拒绝访问。

相关文章
|
25天前
|
安全
浏览器的正常请求和回应
预检通过后,浏览器每次CORS请求自动携带Origin头,服务器响应则必含Access-Control-Allow-Origin字段,表明允许的源,实现跨域资源共享,确保通信安全。
|
25天前
|
安全 Java 应用服务中间件
4.认识SpringSecurity
Spring Security 是基于过滤器链的成熟安全框架,提供认证、鉴权及防御 CSRF 等攻击的核心功能,支持多种认证方式与自定义扩展,保障 Web 应用安全。
|
25天前
|
人工智能 弹性计算 Java
活动回顾:Arm 龙蜥齐携手,共筑 AI 时代开源 OS 新生态
共同探讨了开源操作系统与 Arm Neoverse 平台在人工智能(AI)时代的深度融合与创新实践。
|
24天前
何为跨域?
URL由协议、子域名、主域名、端口和资源路径组成,任一部分不同即属不同域。跨域指不同域间相互访问资源,因安全策略常受限制。
|
25天前
|
存储 缓存 算法
零拷贝
本文探讨文件传输的性能优化,指出传统方法因频繁的上下文切换和内存拷贝导致效率低下。通过零拷贝技术可减少系统调用与数据拷贝,提升传输性能。但大文件场景下,PageCache 可能适得其反,宜采用异步IO+直接IO方案,实现高效并发处理。
|
25天前
|
安全 小程序 JavaScript
OAuth2.0四种授权模式
OAuth2四种授权模式简介:授权码模式最安全,适用于第三方登录;简化模式无授权码,token直接返回,适合无后端场景;密码模式需用户共享账号信息,仅限高度信任服务;客户端模式为服务间调用,无需用户参与。
|
25天前
|
存储 NoSQL 物联网
MongoDB应用场景
MongoDB适用于社交、游戏、物流、物联网及直播等场景,因其支持海量数据存储、高频读写操作。用户信息、动态、日志等低事务性、高并发数据可高效存取,尤其适合用嵌套结构与地理位置索引优化查询,是大规模非结构化数据存储的理想选择。(238字)
|
25天前
|
缓存 Java 数据库连接
MyBatis常见配置
MyBatis配置优先级:方法参数 > resource/url > properties体内。支持多环境配置,通过environments指定,默认使用development。事务管理支持JDBC和MANAGED,结合Spring时由容器管理。常用属性包括缓存、延迟加载、执行器类型等,灵活适配不同场景。
|
25天前
|
Java
什么是泛型擦除
Java泛型是伪泛型,编译后泛型信息被擦除,如List<Object>和List<String>在JVM中均视为List,类型参数不保留,仅用于编译期检查,运行时无法获取泛型实际类型。
|
25天前
|
Java
常见加载顺序
本示例展示了Java中各类代码块的执行顺序:静态代码块随类加载仅执行一次,优先于main方法;局部代码块在方法内按顺序执行;构造代码块每次创建对象前执行,再调用构造器。输出顺序体现其优先级与生命周期。

热门文章

最新文章