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


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

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

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

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

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

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

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

    过滤器名称

    描述

    o.s.s.web.context.SecurityContextPersistenceFilter

    负责从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()

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

  • 相关阅读:
    Java面试题集合
    Java RMI 入门指南
    cmd中可以运行java,但不能运行javac命令
    spring+springmvc+maven+mongodb
    Jmeter脚本上一个请求的返回值当下一个请求的参数用(token)
    Jmeter+ant运行脚本,得到HTML报告
    Jmeter录制脚本
    用Jmeter实现SQLServer数据库的增删查改
    Python3安装Requests
    notepad++运行Python
  • 原文地址:https://www.cnblogs.com/lexiaofei/p/7059966.html
Copyright © 2020-2023  润新知