Spring Security Authentication Provider autenticate() 返回 null 的原因

Ami*_*ahi 2 java spring spring-security spring-boot

最近,我正在研究 Spring security 的 Authentication Provider。

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

我们有另一个方法supports(),它指示该提供程序是否支持身份验证类型。

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

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

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

提前致谢。

hat*_*oor 5

引自Laurentiu Spilca 的Spring Security in Action

\n
\n

AuthenticationProvider 接口中的第二个方法是支持-\n(Class<?> 身份验证)。如果当前 AuthenticationProvider 支持 Authentication 对象提供的类型,您可以实现此方法以返回 true。请注意,即使此方法对对象返回 true,authenticate() 方法仍有可能通过返回 null 来拒绝请求。Spring Security 的设计\n是为了更加灵活,并允许您实现\n AuthenticationProvider,它可以根据请求\xe2\x80\x99s 详细信息(而不仅仅是其类型)来拒绝身份验证请求\n。

\n
\n

及其类比,我认为事情已经很清楚了。

\n
\n

身份验证管理器和身份验证提供程序如何协同工作以验证或无效身份验证请求的类比是为您的门设置更复杂的锁。您可以使用卡或老式物理钥匙打开此锁。\n。锁本身就是身份验证管理器,决定是否开门。为了做出这一决定,它委托给\n两个身份验证提供程序:一个知道如何验证卡\n另一个知道如何验证物理密钥。如果您出示卡来开门,仅使用物理钥匙的身份验证提供程序会抱怨它不知道这种身份验证。\n但其他提供程序支持这种身份验证并验证该身份验证是否有效\n卡对门有效。这实际上是supports() 方法的目的。\n除了测试身份验证类型之外,Spring Security 还添加了一层\n灵活性。门\xe2\x80\x99s锁可以识别多种卡。在这种情况下,当您出示一张卡时,其中一个身份验证提供商可能会说:\xe2\x80\x9c我知道这是一张卡。但这不是我可以验证的卡类型!\xe2\x80\x9d 当supports()返回true但authenticate()返回null时,就会发生这种情况。

\n
\n

在此输入图像描述

\n