我在调试身份验证问题时遇到了这个代码片段:
<security:authentication-manager>
<security:authentication-provider user-service-ref="userDetailsService">
<security:password-encoder hash="sha-256">
<security:salt-source user-property="dateCreated" />
</security:password-encoder>
</security:authentication-provider>
<security:authentication-provider ref="ldapAuthProvider" />
</security:authentication-manager>
我在调试和使用用户凭据时注意到的是,如果第一个身份验证提供程序(即 userDetailsService
)未能对我的用户进行身份验证,则会对我的 LDAP 服务器进行远程调用以尝试验证我的用户。但是,如果第一个身份验证提供程序成功地对我的用户进行身份验证,则永远不会调用第二个身份验证提供程序。
我的问题是这些身份验证提供程序的列表是否以一种方式工作,如果一个失败我们应该跳到下一个?我还想知道身份验证管理器中列出的身份验证提供程序的顺序是否起作用(从优先级的角度来看)?来自 Spring Security 官方文档的额外参考将不胜感激。
答案 0 :(得分:1)
来自 Spring Security reference documentation:
<块引用>每个 AuthenticationProvider 都有机会表明身份验证应该成功、失败或表明它无法做出决定并允许下游 AuthenticationProvider 做出决定。如果配置的 AuthenticationProviders 都无法进行身份验证,则身份验证将失败 (...)
<块引用>实际上,每个 AuthenticationProvider 都知道如何执行特定类型的身份验证。例如,一个 AuthenticationProvider 可能能够验证用户名/密码,而另一个可能能够验证 SAML 断言。
当定义了多个AuthenticationProviders
时,会按照它们声明的顺序进行查询。
如果第一个 AuthenticationProvider
无法得出结论,它将允许下一个 AuthenticationProvider
尝试。