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() |
返回一个跟认证提供者相关的安全实体细节信息
|