【问题标题】:Spring Security Authentication Provider autenticate()'s reason for returning nullSpring Security Authenticationprovider authenticate()'返回null的原因
【发布时间】:2021-12-09 06:57:56
【问题描述】:

最近在研究 Spring security 的 Authentication provider。

在 authenticate() 方法中,文档说,“如果 AuthenticationProvider 无法支持对传递的 Authentication 对象的身份验证,则可能返回 null。在这种情况下,下一个 AuthenticationProvider 支持呈现的身份验证课程将被尝试。

我们还有另一种方法 supports() 指示此提供程序是否支持身份验证类型。

据我所知,"AuthenticationManager" 首先调用 supports() 来检查提供者是否支持这种类型。然后调用 authenticate() 方法。因此,据我了解,仅在提供者支持时才调用身份验证。

所以,我的问题是“如果提供者支持这种类型的身份验证,那么它为什么要从身份验证 () 中返回 null?为什么文档说 ”如果AuthenticationProvider 无法支持对传递的 Authentication 对象进行身份验证” ??? 它应该不总是支持它吗?(因为我们通过supports()检查了它的兼容性。)

你能举一个提供者需要返回 null 的例子吗?

提前致谢。

【问题讨论】:

    标签: java spring spring-boot spring-security


    【解决方案1】:

    来自Spring Security in Action Laurentiu Spilca 的引述

    AuthenticationProvider 接口中的第二种方法是支持- (类> 身份验证)。你可以实现这个方法来返回 如果当前 AuthenticationProvider 支持提供的类型,则为 true 作为身份验证对象。请注意,即使此方法返回 对于一个对象为真,那么 authenticate() 仍然有可能 方法通过返回 null 来拒绝请求。 Spring Security 是 像这样设计更灵活,并允许您实施 可以拒绝身份验证请求的 AuthenticationProvider 基于请求的详细信息,而不仅仅是其类型。

    我认为它的类比很清楚。

    身份验证管理器和身份验证的类比 提供者协同工作以验证或使身份验证无效 请求为您的门安装更复杂的锁。你可以打开这个 使用卡或老式物理钥匙锁定 .锁本身就是决定是否开门的认证管理器。为了做出这个决定,它委托给 两个身份验证提供者:一个知道如何验证卡的提供者 或其他知道如何验证物理密钥的人。如果你呈现 一张卡打开门,只使用物理钥匙的身份验证提供者抱怨说它不知道这种身份验证。 但其他提供者支持这种身份验证并验证是否 卡对门有效。这实际上是 supports() 方法的目的。 除了测试身份验证类型之外,Spring Security 还增加了一层 灵活性。门锁可以识别多种卡。在这种情况下,当 您出示一张卡片,其中一位身份验证提供者可能会说:“我明白这一点 作为一张卡片。但这不是我可以验证的卡类型!”当 support() 返回 true 但 authenticate() 返回 null 时会发生这种情况。

    【讨论】:

      猜你喜欢
      • 2020-09-18
      • 2016-07-24
      • 2013-07-02
      • 2011-01-20
      • 2013-07-08
      • 2016-07-19
      • 2017-05-27
      • 1970-01-01
      • 2020-10-15
      相关资源
      最近更新 更多