Spring Security入门(1-12)Spring Security 的过滤器机制

Servlet过滤器被用来拦截用户请求来进行请求以前或以后的处理,或者干脆重定向这个请求,这取决于servlet过滤器的功能。java

Servlet过滤器处理以后的目标servlet是 MVC 分发web servlet。web

servlet请求按照必定的顺序从一个过滤器到下一个穿过整个过滤器链,最终到达目标servlet。与之相对的是,当servelt处理完请求并返回一个response时,过滤器链按照相反的顺序再次穿过全部的过滤器。spring

 

Spring Security利用Spring在XML配置文件中的自动配置属性,创建了十个servlet过滤器,这些过滤器并无配置在web.xml中,而是由Spring Factory使用JavaEE的servlet过滤器链将他们按顺序组装。数据库

Spring Security使用了过滤器链的实现了本身的抽象,提供了VirtualFilterChain,它能够根据Spring Security XML配置文件中设置的URL模式动态的建立过滤器链(能够将它与标准的Java EE过滤器链进行对比,后者须要在web应用的部署描述文件中进行设置)。api

 

Spring Security的自动配置选项auto-config为你创建了十个Spring Security的过滤器。这些过滤器以及它们使用的顺序,在下面的表格中进行了描述。安全

如:UsernamePasswordAuthenticationFilter是经过<http>配置指令的<form-login>子元素来进行配置的。session

过滤器名称app

描述ide

o.s.s.web.context.SecurityContextPersistenceFilterui

负责从SecurityContextRepository获取或存储SecurityContext。SecurityContext表明了用户安全和认证过的session。

o.s.s.web.authentication.logout.LogoutFilter

监控一个实际为退出功能的URL(默认为/j_spring_security_logout),而且在匹配的时候完成用户的退出功能。

o.s.s.web.authentication.UsernamePasswordAuthenticationFilter

监控一个使用用户名和密码基于form认证的URL(默认为/j_spring_security_check),并在URL匹配的状况下尝试认证该用户。

o.s.s.web.authentication.ui.DefaultLoginPageGeneratingFilter

监控一个要进行基于forn或OpenID认证的URL(默认为/spring_security_login),并生成展示登陆form的HTML

o.s.s.web.authentication.www.BasicAuthenticationFilter

监控HTTP 基础认证的头信息并进行处理

o.s.s.web.savedrequest.

RequestCacheAwareFilter

用于用户登陆成功后,从新恢复由于登陆被打断的请求。

o.s.s.web.servletapi.

SecurityContextHolderAwareRequest

Filter

用一个扩展了HttpServletRequestWrapper的子类(o.s.s.web. servletapi.SecurityContextHolderAwareRequestWrapper)包装HttpServletRequest。

它为请求处理器提供了额外的上下文信息。

o.s.s.web.authentication.

AnonymousAuthenticationFilter

若是用户到这一步尚未通过认证,将会为这个请求关联一个认证的token,标识此用户是匿名的。

o.s.s.web.session.

SessionManagementFilter

根据认证的安全实体信息跟踪session,保证全部关联一个安全实体的session都能被跟踪到。

o.s.s.web.access.

ExceptionTranslationFilter

解决在处理一个请求时产生的指定异常

o.s.s.web.access.intercept.

FilterSecurityInterceptor

简化受权和访问控制决定,委托一个AccessDecisionManager完成受权的判断

Spring Security拥有总共大约25个过滤器,它们可以根据你的须要进行适当的应用以改变用户请求的行为。

若是须要的话,你也能够添加你本身实现了javax.servlet.Filter接口的过滤器。

请记住,若是你在XML配置文件中使用了auto-config属性,以上表格中列出的过滤器自动添加的。

经过使用一些额外的配置指令,以上列表中的过滤器可以精确的控制是否被包含。

 

你可能想知道DelegatingFilterProxy是怎样找到Spring Security配置的过滤器链的。让咱们回忆一下,在web.xml文件中,咱们须要给DelegatingFilterProxy一个过滤器的名字:

<filter>

  <filter-name>springSecurityFilterChain</filter-name>

  <filter-class>

    org.springframework.web.filter.DelegatingFilterProxy

  </filter-class>

</filter>

这个过滤器的名字并非随意配置的,实际上会跟根据这个名字把Spring Security织入到DelegatingFilterProxy。除非明确配置,不然DelegatingFilterProxy会在Spring WebApplicationContext中寻找同名的配置bean(名字是在filter-name中指明的)。

 

 

三个主要的组件负责这项重要的事情:

接口名

描述/角色

AbstractAuthenticationProcessingFilter

它在基于web的认证请求中使用。处理包含认证信息的请求,如认证信息多是form POST提交的、SSO信息或者其余用户提供的。建立一个部分完整的Authentication对象以在链中传递凭证信息。

AuthenticationManager

它用来校验用户的凭证信息,或者会抛出一个特定的异常(校验失败的状况)或者完整填充Authentication对象,将会包含了权限信息。

AuthenticationProvider

它为AuthenticationManager提供凭证校验。一些AuthenticationProvider的实现基于凭证信息的存储,如数据库,来断定凭证信息是否能够被承认。

有两个重要接口的实现是在认证链中被这些参与的类初始化的,它们用来封装一个认证过(或尚未认证过的)的用户的详细信息和权限。

o.s.s.core.Authentication是你之后要常常接触到的接口,由于它存储了用户的详细信息,包括惟一标识(如用户名)、凭证信息(如密码)以及本用户被授予的一个或多个权限(o.s.s.core.

GrantedAuthority)。开发人员一般会使用Authentication对象来获取用户的详细信息,或者使用自定义的认证明现以便在Authentication对象中增长应用依赖的额外信息。

如下列出了Authentication接口能够实现的方法:

方法签名

描述

Object getPrincipal()

返回安全实体的惟一标识(如,一个用户名)

Object getCredentials()

返回安全实体的凭证信息

List<GrantedAuthority>

getAuthorities()

获得安全实体的权限集合,根据认证信息的存储决定的。

Object getDetails()

返回一个跟认证提供者相关的安全实体细节信息

 

相关文章
相关标签/搜索