当前位置: 首页 > 知识库问答 >
问题:

Spring Security执行顺序

薛淮晨
2023-03-14

我无法确定spring security在何时何地执行身份验证管理器。我的意思是,certian过滤器按如下顺序执行:

  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

但是当身份验证提供者对提供的用户名和密码进行身份验证时,我的意思是问下面这些过滤器是身份验证提供者执行的。

问候贾延德拉

共有1个答案

子车安和
2023-03-14

来自Spring Security文档:

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

>

  • ChannelProcessingFilter,因为它可能需要重定向到其他协议

    因此,在Web请求开始时,可以在SecurityContextHolder中设置SecurityContext,并且在Web请求结束时,可以将对SecurityContext的任何更改复制到Http会话(准备用于下一个Web请求)

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

    身份验证处理机制-UsernamePassword身份验证过滤器,Cas验证过滤器,基本身份验证过滤器等-以便可以修改SecurityContextHolder以包含有效的身份验证请求令牌

    SecurityContextHolderAwareRequestFilter,如果您正在使用它将支持Spring Security的HttpServletRequestWrapper安装到servlet容器中

    因此,如果之前没有更新SecurityContextHolder的身份验证处理机制,并且请求呈现一个cookie,使记住我的服务发生,一个合适的记住身份验证对象将放在那里

    AnonymousAuthenticationFilter,这样,如果没有早期的身份验证处理机制更新SecurityContextHolder,则会将匿名身份验证对象放在那里

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

    FilterSecurity Interceptor,用于保护web URI,并在访问被拒绝时引发异常

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

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

  •  类似资料:
    • 问题内容: 我试图理解这段代码,不确定为什么第二遍在第一遍之前执行。如果有人真的可以帮助我,那就太好了! 输出: 问题答案: 您没有任何内容可以显式同步两个goroutine的顺序。如果运行足够的时间,您将看到调用以不同的顺序进行打印。当执行goroutine时,由于它们是并发操作,因此无法保证它们将何时执行和/或完成。您需要使用各种标准库程序包或通道本身来同步并发运行的goroutine的执行。

    • 类D 主要方法是 Bean配置文件是 程序的输出为:

    • 我正在比较算法(前n个数之和)的顺序和并行性能(使用ForkJoinPool): 我试着用不同的NumLoop来获得不同的值,但顺序法总是表现得更好,而且也是按3-4的顺序。 考虑到阵列大小并不是那么小,并行版本在这里的性能不应该更好吗。

    • 问题内容: 我们有一个基于石英的调度程序应用程序,该应用程序每分钟运行约1000个作业,每分钟的秒数均匀分布,即每秒约16-17个作业。理想情况下,这16-17个作业应同时触发,但是该作业的execute方法的第一个语句(仅记录执行时间)非常晚。例如,假设我们从05:00到05:04每分钟安排1000个作业。因此,理想情况下,计划在05:03:50进行的作业应该在05:03:50记录了execut

    • 我试图理解java中完整期货的非阻塞回调性质 有了上面的代码,我总是看到下面看到的输出 线程名称ForkJoinPool.common池工人-1 thenApply Thread name main thenApply Thread name main thenAcceptThread name main Thread name main 这个顺序似乎建议主线程等待所有Futures线程的执行。

    • 问题内容: 我正在学习Go,并且遇到了以下代码片段: 有人可以告诉我为什么“ sum”函数的第二个调用在第一个调用之前通过通道吗?在我看来,输出应为: 我还使用无缓冲通道对此进行了测试,它也给出了相同顺序的输出。我想念什么? 问题答案: 您正在代码中调用go例程,但无法确定例程何时结束并将该值传递到缓冲通道。 由于该代码是异步的,因此只要例程完成,它将把数据写入通道,并在另一侧读取。在上面的示例中