【问题标题】:Spring Security Sequence of executionSpring Security 执行顺序
【发布时间】:2015-12-17 04:46:44
【问题描述】:

我无法找到 Spring Security 执行身份验证管理器的确切位置和时间。我的意思是有一些按顺序执行的过滤器,如下所示:

  FIRST
- CHANNEL_FILTER
- CONCURRENT_SESSION_FILTER
- SECURITY_CONTEXT_FILTER
- LOGOUT_FILTER
- X509_FILTER

- PRE_AUTH_FILTER
- CAS_FILTER
- FORM_LOGIN_FILTER
- OPENID_FILTER
- BASIC_AUTH_FILTER
- SERVLET_API_SUPPORT_FILTER
- REMEMBER_ME_FILTER
- ANONYMOUS_FILTER

- EXCEPTION_TRANSLATION_FILTER
- SESSION_MANAGEMENT_FILTER
- FILTER_SECURITY_INTERCEPTOR
- SWITCH_USER_FILTER
- LAST

但是,当身份验证提供程序对提供的用户名和密码进行身份验证时,我的意思是询问以下这些过滤器是在哪些之后执行的身份验证提供程序。

问候 贾延德拉

【问题讨论】:

    标签: spring authentication spring-security


    【解决方案1】:

    来自Spring Security documentation

    过滤器在链中定义的顺序非常重要。 无论您实际使用哪种过滤器,订单都应该 如下:

    1. ChannelProcessingFilter,因为它可能需要重定向到不同的协议

    2. SecurityContextPersistenceFilter,因此可以在 Web 请求开始时在 SecurityContextHolder 中设置 SecurityContext,并且 对 SecurityContext 的任何更改都可以复制到 HttpSession 当网络请求结束时(准备好与下一个网络请求一起使用)

    3. ConcurrentSessionFilter,因为它使用 SecurityContextHolder 功能但需要更新 SessionRegistry 以反映 校长的持续请求

    4. 身份验证处理机制 - UsernamePasswordAuthenticationFilter、CasAuthenticationFilter、 BasicAuthenticationFilter 等 - 以便 SecurityContextHolder 可以 修改为包含有效的身份验证请求令牌

    5. The SecurityContextHolderAwareRequestFilter,如果您使用它来安装 Spring Security 感知 HttpServletRequestWrapper 到您的 servlet 容器

    6. RememberMeAuthenticationFilter,这样如果没有更早的认证处理机制更新SecurityContextHolder, 并且该请求提供了一个 cookie,该 cookie 使 remember-me 服务能够 发生时,将放置一个合适的记忆身份验证对象 那里

    7. AnonymousAuthenticationFilter,这样如果没有更早的认证处理机制更新SecurityContextHolder, 一个匿名的身份验证对象将被放在那里

    8. ExceptionTranslationFilter,捕获任何 Spring Security 异常,以便可以返回 HTTP 错误响应或 可以启动适当的 AuthenticationEntryPoint

    9. FilterSecurityInterceptor,用于保护 Web URI 并在访问被拒绝时引发异常

    因此在第 4 步调用了身份验证管理器。如果您查看UsernamePasswordAuthenticationFilter 的源代码,您将看到如下内容:

    public Authentication attemptAuthentication(HttpServletRequest request,
            HttpServletResponse response) throws AuthenticationException {
        // ...
        return this.getAuthenticationManager().authenticate(authRequest);
    }
    

    【讨论】:

    • 非常正确。在实现需要注入身份验证管理器的自定义用户名密码身份验证过滤器时实现了这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 2015-12-22
    • 2019-03-09
    • 1970-01-01
    • 2017-01-15
    • 2011-04-25
    相关资源
    最近更新 更多