如何在具有 Spring 安全性的同一请求中使用两个身份验证提供程序?

How to use two authentication providers in the same request with Spring Security?

我在我的应用程序中配置了两个身份验证提供程序,一个使用 LDAP,另一个在数据库中查找:

<sec:authentication-manager>
    <sec:ldap-authentication-provider server-ref="ldapServer" />
    <sec:authentication-provider user-service-ref="dbUserDetailsService" />
</sec:authentication-manager>

Spring 首先尝试使用 LDAP,如果在那里找不到用户,它会尝试我的自定义提供程序。

我想做的是强制 Spring 在所有可用的提供程序中对用户进行身份验证。在这种情况下,如果它可以首先在 LDAP 服务器中执行登录,它只会尝试我的自定义提供程序。如果自定义提供者中的认证失败,则整个认证失败。

是否可以通过 Spring 安全性实现此目的?

我认为您可以实现自己的身份验证提供程序,在其中注入两个实例 - 一个是 LdapAuthenticationProvider,另一个是 DaoAuthenticationProvider。 您将必须实施一个方法

public Authentication authenticate(Authentication authentication) throws AuthenticationException

您可以首先将身份验证调用代理到 ​​LdapAuthenticationProvider,如果成功,则调用 DaoAuthenticationProvider。