- 浏览: 193770 次
- 性别:
- 来自: 南京
文章分类
最新评论
前言:
spring security在web应用中是通过各种各样的filter来做认证和安全控制的,由于filter之间的依赖性,过滤器链中filter的顺序也极其重要,不管实际项目中我们选用了哪些过滤器。
1.filter顺序
2.在spring security中是如何保证filter的顺序呢
2.1 简单来说spring是通过FilterComparator类来保证顺序的
在这个类中事先将security中可能会用到的filter顺序定义好,那这个类是如何被调用的呢?
在前面一节(spring-security(十六)Filter配置原理),我们知道spring 安全相关的Filter是在WebSecurity的build方法中调用HttpSecurity的build来将追加到HttpSecurity中filter构建成SecurityFilterChain,再把所有的SecurityFilterChain追加到FilterChainProxy中,最后通过DelegatingFilterProxy注册到ServletContext中的,我们就来看下HttpSecurity的build方法
可以看到,在这个类中构建SecurityFilterChain前会先对filter进行排序,而这个排序类就是FilterComparator,所以不管我们加入到HttpSecurity中的filter顺序是怎样的,spring security最终都会确保我们的Filter是严格按照前面讲述的顺序进行的。具体我们用到的Filter是如何追加到HttpSecurity中的,后续讲具体的Filter时再进行分析。
spring security在web应用中是通过各种各样的filter来做认证和安全控制的,由于filter之间的依赖性,过滤器链中filter的顺序也极其重要,不管实际项目中我们选用了哪些过滤器。
1.filter顺序
- ChannelProcessingFilter,访问协议控制过滤器,可能会将我们重新定向到另外一种协议,如从http转换成https
- SecurityContextPersistenceFilter,用来创建一个SecurityContext并存储在SecurityContextHolder中,因为后续filter需要用SecurityContext存储的认证相关信息,所以需要在请求一开始就要把这些信息设置好,这样也能使在认证过程中对SecurityContext的任何修改都可以保存下来,并在请求结束后存储在HttpSession中(以在下次请求时使用)
- ConcurrentSessionFilter,并发访问控制过滤器,主要做两件事
- UsernamePasswordAuthenticationFilter、CasAuthenticationFilter、BasicAuthenticationFilter等认证对应的filter,经过这些过滤器后SecurityContextHolder中将包含一个完全组装好的Authentication对象,从而使后续鉴权能正常执行
- SecurityContextHolderAwareRequestFilter,用来将ServletRequest封装成能关联到SecurityContextHolder的SecurityContextHolderAwareRequestWrapper(servlet 2.5版本)或者Servlet3SecurityContextHolderAwareRequestWrapper(servlet3.0+版本),从而提供和servlet的集成功能,如调用HttpServletRequest.getUserPrincipal()、HttpServletRequest.authenticate()、HttpServletRequest.login()、HttpServletRequest.logout()等方法
- JaasApiIntegrationFilter,当采用Java Authentication and Authorization Service (JAAS)认证方式时,这个filter用来将SecurityContextHolder中的JaasAuthenticationToken转化成Subject供后续filter使用
- RememberMeAuthenticationFilter,记忆认证处理过滤器,如果前面认证对应的filter没有对当前请求进行处理,并且当前的请求的cookie中有启用RememberMe功能的标识时(默认是cookie中有名称是remember-me的参数,对应的值是1,true,OK),这个filter将对请求进行处理, 从cookie中解析出用户,并进行认证处理,之后在SecurityContextHolder中存入一个Authentication对象。
- AnonymousAuthenticationFilter,匿名认证处理过滤器,如果前面所有的认证处理没有对请求进行认证处理,这个过滤器会向SecurityContextHolder中存入一个匿名的Authentication对象,赋予ROLE_ANONYMOUS的权限,目的是为了在后面的鉴权操作中能始终获取到一个Authentication进行处理,不用考虑null的情况。
- ExceptionTranslationFilter,异常处理过滤器,这个过滤器主要拦截后续过滤器(FilterSecurityInterceptor)操作中抛出的异常,根据异常的类型如AuthenticationException、AccessDeniedException等采取不同的策略,重定向到认证登录页面或重定向到错误页或者直接返回前端一个403码
- FilterSecurityInterceptor 安全拦截过滤器类,获取当前请求url对应的ConfigAttribute,并调用accessDecisionManager进行鉴权处理,如果用户有权执行当前请求就调用真实的处理逻辑,否则抛出相应的异常AuthenticationException、AccessDeniedException。
1.从SessionRegistry中获取SessionInformation来判断session是否过期,如果过期,调用配置好的logout handlers,从而使session无效,并调用SessionInformationExpiredStrategy的onExpiredSessionDetected方法实现重定向或者通知用户session已过期 | |
2.如果没有过期,刷新当前session的LastRequest时间,在多用户同时访问时如果配置了最大并发访问数量,会将LastRequest时间最早的session设置成过期,从而实现并发访问控制 |
2.在spring security中是如何保证filter的顺序呢
2.1 简单来说spring是通过FilterComparator类来保证顺序的
FilterComparator() { int order = 100; put(ChannelProcessingFilter.class, order); order += STEP; put(ConcurrentSessionFilter.class, order); order += STEP; put(WebAsyncManagerIntegrationFilter.class, order); order += STEP; put(SecurityContextPersistenceFilter.class, order); order += STEP; put(HeaderWriterFilter.class, order); order += STEP; put(CorsFilter.class, order); order += STEP; put(CsrfFilter.class, order); order += STEP; put(LogoutFilter.class, order); order += STEP; put(X509AuthenticationFilter.class, order); order += STEP; put(AbstractPreAuthenticatedProcessingFilter.class, order); order += STEP; filterToOrder.put("org.springframework.security.cas.web.CasAuthenticationFilter", order); order += STEP; put(UsernamePasswordAuthenticationFilter.class, order); order += STEP; put(ConcurrentSessionFilter.class, order); order += STEP; filterToOrder.put( "org.springframework.security.openid.OpenIDAuthenticationFilter", order); order += STEP; put(DefaultLoginPageGeneratingFilter.class, order); order += STEP; put(ConcurrentSessionFilter.class, order); order += STEP; put(DigestAuthenticationFilter.class, order); order += STEP; put(BasicAuthenticationFilter.class, order); order += STEP; put(RequestCacheAwareFilter.class, order); order += STEP; put(SecurityContextHolderAwareRequestFilter.class, order); order += STEP; put(JaasApiIntegrationFilter.class, order); order += STEP; put(RememberMeAuthenticationFilter.class, order); order += STEP; put(AnonymousAuthenticationFilter.class, order); order += STEP; put(SessionManagementFilter.class, order); order += STEP; put(ExceptionTranslationFilter.class, order); order += STEP; put(FilterSecurityInterceptor.class, order); order += STEP; put(SwitchUserFilter.class, order); }
在这个类中事先将security中可能会用到的filter顺序定义好,那这个类是如何被调用的呢?
在前面一节(spring-security(十六)Filter配置原理),我们知道spring 安全相关的Filter是在WebSecurity的build方法中调用HttpSecurity的build来将追加到HttpSecurity中filter构建成SecurityFilterChain,再把所有的SecurityFilterChain追加到FilterChainProxy中,最后通过DelegatingFilterProxy注册到ServletContext中的,我们就来看下HttpSecurity的build方法
@Override protected DefaultSecurityFilterChain performBuild() throws Exception { Collections.sort(filters, comparator); return new DefaultSecurityFilterChain(requestMatcher, filters); }
可以看到,在这个类中构建SecurityFilterChain前会先对filter进行排序,而这个排序类就是FilterComparator,所以不管我们加入到HttpSecurity中的filter顺序是怎样的,spring security最终都会确保我们的Filter是严格按照前面讲述的顺序进行的。具体我们用到的Filter是如何追加到HttpSecurity中的,后续讲具体的Filter时再进行分析。
发表评论
-
spring-security(二十五)鉴权
2018-03-27 11:21 1597前言 本文将详细探讨spring security中的鉴权 ... -
test
2018-03-19 21:20 0什么是服务发现 ... -
spring-security(二十四)CSRF
2018-03-24 09:54 81561.什么是CSRF攻击 下面我们以一个具体的例子来说明这种常见 ... -
spring-security(二十三)Remember-Me认证
2018-03-09 21:06 1340前言: Remember-me认证方式指的是能在不同的会话 ... -
spring-security(二十二)基本认证和摘要认证
2018-03-06 16:58 1801前言: 在web应用中,非常流行以基本认证和摘要认证作为备 ... -
spring-security(二十一)核心Filter-UsernamePasswordAuthenticationFilter
2018-03-04 11:05 1236一、UsernamePasswordAuthenticatio ... -
spring-security(二十)核心Filter-SecurityContextPersistenceFilter
2018-02-28 21:40 1129一、SecurityContextPersistenceFil ... -
spring-security(十九)核心Filter-ExceptionTranslationFilter
2018-02-27 16:31 2058前言: 在spring的安全 ... -
spring-security(十八)核心Filter-FilterSecurityInterceptor
2018-02-25 10:59 2343前言: 当用spring secur ... -
spring-security(二十六)整合CAS 实现SSO
2018-04-05 18:09 12401.cas 认证流程 2.spring security ... -
spring-security(十六)Filter配置原理
2018-02-21 15:18 2384前言: spring security最常见的应用场景还是 ... -
spring-security(十五) Password编码
2018-02-19 15:15 1224前言: 在实际应用中 ... -
spring-security(十四)UserDetailsService
2018-02-19 11:35 1470前言: 作为spring security的核心类,大多数 ... -
spring-security(十三)核心服务类
2018-02-18 16:46 1410前言: 在之前的篇章中我们已经讲述了spring secu ... -
spring-security(十二)鉴权方式概述
2018-02-18 10:42 2525前言: 本文主要讲述在spring security鉴权的 ... -
spring-security(十一)Web应用认证过程
2018-02-17 17:17 1235前言: 本文将探讨当 ... -
spring-security(十)基本认证过程
2018-02-17 13:55 2104前言: 在spring security中认证具体指的是什 ... -
spring-security(九)-核心组件
2018-02-17 10:46 867前言: 本文主要介绍在spring security中的几 ... -
spring-security(八)java config-sample之cas client
2018-02-16 11:26 2067前言: SSO英文全称Single Sign On,单点登 ... -
spring-security(七)java config-sample之concurrency
2018-02-15 10:51 670前言: 在实际应用中,我们可能会限制一个用户同时登录同一个 ...
相关推荐
4. **Filter Chain**:Spring Security的核心在于一系列的过滤器,它们按照预定义的顺序执行,构成Filter Chain。`org.springframework.security.web`包下的Filter如FilterSecurityInterceptor、...
1. **Filter Chain**:Spring Security通过一系列过滤器实现其功能,这些过滤器按照特定顺序组织成一个过滤链。每个过滤器负责处理请求的特定方面,如认证、授权等。 2. **AuthenticationManager**:这是Spring ...
在Spring Security中,所有的安全性操作都是通过Filter Chain来实现的。这些过滤器如`DelegatingFilterProxy`、`SecurityContextPersistenceFilter`、`UsernamePasswordAuthenticationFilter`等,按照配置的顺序...
Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于保护基于Java的应用程序。在Spring生态中,它被广泛应用于构建安全的Web应用程序。本资料“狂神-spring-security素材”可能包含了关于...
- **过滤器链(Filter Chain)**:Spring Security的核心在于一系列的过滤器,它们按特定顺序拦截请求,处理认证和授权。 2. **主要组件**: - **AuthenticationProvider**:处理用户的认证请求,实现具体的认证...
- **请求处理**:当用户尝试访问受保护的资源时,Spring Security 的 Filter Security Interceptor 检测请求并触发认证过程。 - **登录**:用户提交登录信息后,UsernamePasswordAuthenticationFilter 处理这些...
在`web.xml`中,我们会配置`DelegatingFilterProxy`指向Spring Security的`FilterSecurityInterceptor`,这使得我们可以自定义过滤器顺序和行为。 4. **Spring Security配置**:Spring Security的配置可以通过XML或...
1. **Filter Chain**: Spring Security的核心在于一系列的过滤器,它们按照特定顺序执行,处理HTTP请求。这些过滤器负责身份验证、授权以及其他的防护措施。 2. **Authentication Manager**: 这是Spring Security...
3. **过滤器链(Filter Chain)**:Spring Security的核心是过滤器链,它由多个安全相关的过滤器组成,这些过滤器按照特定顺序执行,处理HTTP请求。主要的过滤器包括`DelegatingFilterProxy`、`...
- **Filter Chain(过滤器链)**: Spring Security通过一系列Web安全过滤器来保护HTTP请求,这些过滤器按照特定顺序执行,每个都有特定的任务,如CSRF防护、登录验证等。 - **Provider(提供者)**: 认证提供者...
`DelegatingFilterProxy`通常是用来代理Spring Security的过滤器,而`SecurityFilterChain`则管理这些过滤器的顺序和执行。 4. **登录与会话管理(Login and Session Management)**:自定义登录页面是Spring ...
- **Filter顺序**:过滤器的执行顺序对于处理安全请求至关重要。 - **添加Filter到FilterChain**:可以自定义过滤器并将其添加到过滤链中。 - **DelegatingFilterProxy** 和 **FilterChainProxy**:这两个组件用于...
1. **Filter Chain**:Spring Security 通过一系列的过滤器(Filter)来处理HTTP请求,这些过滤器构成了Filter Chain,它们按照特定的顺序执行,完成认证、授权等安全操作。 2. **Authentication**:认证是确认用户...
在实际项目中,理解并合理使用Spring Security的配置非常重要,例如正确配置过滤器顺序、选择合适的认证和授权策略,以及防止常见的安全威胁如CSRF攻击。 总结,Spring Security 3的源码分析是一个深度学习的过程,...
本篇我们将深入探讨如何在Spring Security中自定义Filter,以及相关的知识点。 首先,我们需要了解Spring Security的Filter工作原理。Spring Security的过滤器链是由`DelegatingFilterProxy`管理的,它会委托给`...
《Spring Security实战演练》 Spring Security是Java领域中一个强大的安全框架,用于处理应用程序的安全需求。这个名为"spring-security-playground"的项目,显然是为了帮助开发者深入理解和实践Spring Security的...
《行动中的Spring安全》这本书深入探讨了Spring Security框架在实际应用中的使用,它是一个强大的Java安全解决方案,用于保护Web应用程序免受各种安全威胁。Spring Security提供了全面的安全控制,包括身份验证、...
确保Spring Security的Filter排在其他Filter之前,例如Struts2的Filter,以避免数据处理顺序问题。 ```xml <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework....
6. **Web安全(Web Security)**:对于基于Servlet的应用,Spring Security通过Servlet Filter进行安全控制;对于响应式(Reactive)应用,它提供了WebFlux安全支持,利用Reactor库处理非阻塞的HTTP请求。 7. **API...
- **Filter Chain**:这是Spring Security的核心,一系列过滤器按特定顺序处理HTTP请求。 - **AuthenticationManager**:负责身份验证,将用户的凭证与存储在系统中的凭证进行匹配。 - **UserDetailsService**:...