`

spring-security(十七)Filter顺序及简介

阅读更多
前言:
  spring security在web应用中是通过各种各样的filter来做认证和安全控制的,由于filter之间的依赖性,过滤器链中filter的顺序也极其重要,不管实际项目中我们选用了哪些过滤器。
1.filter顺序
  • ChannelProcessingFilter,访问协议控制过滤器,可能会将我们重新定向到另外一种协议,如从http转换成https
  • SecurityContextPersistenceFilter,用来创建一个SecurityContext并存储在SecurityContextHolder中,因为后续filter需要用SecurityContext存储的认证相关信息,所以需要在请求一开始就要把这些信息设置好,这样也能使在认证过程中对SecurityContext的任何修改都可以保存下来,并在请求结束后存储在HttpSession中(以在下次请求时使用)
  • ConcurrentSessionFilter,并发访问控制过滤器,主要做两件事
  •    
    1.从SessionRegistry中获取SessionInformation来判断session是否过期,如果过期,调用配置好的logout handlers,从而使session无效,并调用SessionInformationExpiredStrategy的onExpiredSessionDetected方法实现重定向或者通知用户session已过期
    2.如果没有过期,刷新当前session的LastRequest时间,在多用户同时访问时如果配置了最大并发访问数量,会将LastRequest时间最早的session设置成过期,从而实现并发访问控制
  • 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。

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时再进行分析。
  • 大小: 68 KB
分享到:
评论

相关推荐

    spring-security-core-2.0.5.RELEASE.src

    4. **Filter Chain**:Spring Security的核心在于一系列的过滤器,它们按照预定义的顺序执行,构成Filter Chain。`org.springframework.security.web`包下的Filter如FilterSecurityInterceptor、...

    spring-security-core-2.0.6.RELEASE

    1. **Filter Chain**:Spring Security通过一系列过滤器实现其功能,这些过滤器按照特定顺序组织成一个过滤链。每个过滤器负责处理请求的特定方面,如认证、授权等。 2. **AuthenticationManager**:这是Spring ...

    spring-security-4.0 jar包

    在Spring Security中,所有的安全性操作都是通过Filter Chain来实现的。这些过滤器如`DelegatingFilterProxy`、`SecurityContextPersistenceFilter`、`UsernamePasswordAuthenticationFilter`等,按照配置的顺序...

    狂神-spring-security素材.rar

    Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于保护基于Java的应用程序。在Spring生态中,它被广泛应用于构建安全的Web应用程序。本资料“狂神-spring-security素材”可能包含了关于...

    spring-security-3.1.x.zip 源码下载

    - **过滤器链(Filter Chain)**:Spring Security的核心在于一系列的过滤器,它们按特定顺序拦截请求,处理认证和授权。 2. **主要组件**: - **AuthenticationProvider**:处理用户的认证请求,实现具体的认证...

    spring-security3入门教程

    - **请求处理**:当用户尝试访问受保护的资源时,Spring Security 的 Filter Security Interceptor 检测请求并触发认证过程。 - **登录**:用户提交登录信息后,UsernamePasswordAuthenticationFilter 处理这些...

    spring-security demo实例

    在`web.xml`中,我们会配置`DelegatingFilterProxy`指向Spring Security的`FilterSecurityInterceptor`,这使得我们可以自定义过滤器顺序和行为。 4. **Spring Security配置**:Spring Security的配置可以通过XML或...

    spring-security初体验demo

    1. **Filter Chain**: Spring Security的核心在于一系列的过滤器,它们按照特定顺序执行,处理HTTP请求。这些过滤器负责身份验证、授权以及其他的防护措施。 2. **Authentication Manager**: 这是Spring Security...

    spring-security第三回

    3. **过滤器链(Filter Chain)**:Spring Security的核心是过滤器链,它由多个安全相关的过滤器组成,这些过滤器按照特定顺序执行,处理HTTP请求。主要的过滤器包括`DelegatingFilterProxy`、`...

    spring-security3 入门篇

    - **Filter Chain(过滤器链)**: Spring Security通过一系列Web安全过滤器来保护HTTP请求,这些过滤器按照特定顺序执行,每个都有特定的任务,如CSRF防护、登录验证等。 - **Provider(提供者)**: 认证提供者...

    spring-security1.zip

    `DelegatingFilterProxy`通常是用来代理Spring Security的过滤器,而`SecurityFilterChain`则管理这些过滤器的顺序和执行。 4. **登录与会话管理(Login and Session Management)**:自定义登录页面是Spring ...

    初识 Spring Security - v1.1.pdf

    - **Filter顺序**:过滤器的执行顺序对于处理安全请求至关重要。 - **添加Filter到FilterChain**:可以自定义过滤器并将其添加到过滤链中。 - **DelegatingFilterProxy** 和 **FilterChainProxy**:这两个组件用于...

    spring-security

    1. **Filter Chain**:Spring Security 通过一系列的过滤器(Filter)来处理HTTP请求,这些过滤器构成了Filter Chain,它们按照特定的顺序执行,完成认证、授权等安全操作。 2. **Authentication**:认证是确认用户...

    Spring_Security3_源码分析

    在实际项目中,理解并合理使用Spring Security的配置非常重要,例如正确配置过滤器顺序、选择合适的认证和授权策略,以及防止常见的安全威胁如CSRF攻击。 总结,Spring Security 3的源码分析是一个深度学习的过程,...

    springsecurity2 自定义filter实现

    本篇我们将深入探讨如何在Spring Security中自定义Filter,以及相关的知识点。 首先,我们需要了解Spring Security的Filter工作原理。Spring Security的过滤器链是由`DelegatingFilterProxy`管理的,它会委托给`...

    spring-security-playground

    《Spring Security实战演练》 Spring Security是Java领域中一个强大的安全框架,用于处理应用程序的安全需求。这个名为"spring-security-playground"的项目,显然是为了帮助开发者深入理解和实践Spring Security的...

    spring-security-in-action

    《行动中的Spring安全》这本书深入探讨了Spring Security框架在实际应用中的使用,它是一个强大的Java安全解决方案,用于保护Web应用程序免受各种安全威胁。Spring Security提供了全面的安全控制,包括身份验证、...

    Spring Security简易配置指南

    确保Spring Security的Filter排在其他Filter之前,例如Struts2的Filter,以避免数据处理顺序问题。 ```xml <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework....

    spring_security 配置

    - **Filter Chain**:这是Spring Security的核心,一系列过滤器按特定顺序处理HTTP请求。 - **AuthenticationManager**:负责身份验证,将用户的凭证与存储在系统中的凭证进行匹配。 - **UserDetailsService**:...

    SpringSecurity实现的权限管理(含包)

    SpringSecurity是Java开发中用于安全控制的一个强大框架,主要用于实现身份验证、授权和访问控制等功能。在本资源中,我们关注的是如何通过SpringSecurity来实现一个简单的权限管理系统。以下将详细解释Spring...

Global site tag (gtag.js) - Google Analytics