【问题标题】:Spring Security authenticate logicSpring Security 认证逻辑
【发布时间】:2021-01-14 18:39:40
【问题描述】:

Spring 安全中的端点安全是通过过滤器列表实现的。我需要澄清一下。

假设过滤器已成功验证请求并在安全上下文中设置验证对象。该过滤器还调用了 filterchain.dofilter()。假设 authentication.isAuthenticated() 返回 true - 过滤器已经设置了它。

如果调用 isAuthenticated() 时安全上下文中的身份验证对象返回 true,那么后续过滤器是否会忽略身份验证过程(意味着它们不会调用 authenticationmanager.authenticate())?或者即使 isAuthenticated() 在从安全上下文中检索到的身份验证对象上返回 true,他们仍然会调用 authenticationmanager.authenticate () 吗?假设请求路径与过滤器配置匹配(这意味着后续过滤器也会看到请求,因为请求 servlet 路径与其配置匹配)

提前致谢。

【问题讨论】:

    标签: spring spring-security


    【解决方案1】:

    我会尽量详细回答。

    首先,Spring Security 确实使用了过滤器链,但通常,身份验证从链中的一个过滤器开始。如果您以多种方式对用户进行身份验证,那么您需要实现多个身份验证提供程序(AuthenticationProvider)。看一下图 1。身份验证从过滤器级别开始,由一个名为 AuthenticationManager 的管理器负责。经理找到适合的 AuthenticationProvider。 Figure 1

    在某些情况下,您可能希望实现多个身份验证过滤器。假设您有一个自定义的多因素身份验证 (MFA) 解决方案。但决定跳过哪些过滤器的是您。默认情况下,请求遵循链中的每个过滤器。

    如果您实现了 OncePerRequestFilter 并覆盖 shouldNotFilter() 方法以告知过滤器何时不适用,您可以设计一个要跳过的过滤器。

    总结:

    • 使用身份验证提供程序以多种方式实施身份验证
    • 除非您明确让它们跳过它,否则后续过滤器将看到该请求
    • 我还向您推荐我写的关于 Spring Security 的书的第一部分 - Spring Security in Action。您将找到有关身份验证、授权和过滤器链如何工作的更详细说明。

    【讨论】:

    • 感谢 Laurentiu 的详细回答。通常我们在 Spring 上下文中只有一个 AuthenticationManager,它是所有过滤器都将使用的管理器。如果之前的过滤器之一已经对请求进行了身份验证并在上下文中设置了完全身份验证的身份验证,那么后续过滤器是否会再次尝试按照默认管理器逻辑(ProviderManager)进行身份验证?我知道我们可以使用 shouldNotFilter 方法跳过路径,但假设我故意让它通过其他过滤器。它会击中资源(控制器类)吗?我问的是t
    • 它会命中资源(控制器类)吗?我在询问默认的 AuthenticationManager 逻辑(ProviderManager)。
    • 非常感谢您的视频。这就是我可以这样讨论的方式。非常了解内部原理!
    • 同样,一般来说,对于身份验证,您有一个过滤器委托给 AuthenticationManager。在过滤器链中,您有多个过滤器,但它们并不都是身份验证过滤器。你有针对 CSRF、CORS、授权等的过滤器。过滤器链如下所示:过滤器 A -> 身份验证过滤器 -> CSRF -> 另一个过滤器 -> 授权过滤器 -> 另一个过滤器 -> ... -> 控制器
    • 我认为您的困惑来自于您认为您有多个身份验证过滤器都委托给身份验证管理器的事实。但事实并非如此。您有一个过滤器可以做到这一点,至少在您没有实现自定义过滤器的情况下,这是您的责任,您希望他们做什么。
    猜你喜欢
    • 2012-08-15
    • 2016-08-11
    • 2016-11-15
    • 2015-03-17
    • 2013-11-03
    • 2013-08-10
    • 2012-10-15
    • 2015-10-12
    • 2013-04-24
    相关资源
    最近更新 更多