如何在 Spring Security 的同一个请求中使用两个身份验证提供程序?

Posted

技术标签:

【中文标题】如何在 Spring Security 的同一个请求中使用两个身份验证提供程序?【英文标题】:How to use two authentication providers in the same request with Spring Security? 【发布时间】:2015-05-16 06:55:40 【问题描述】:

我的应用程序中配置了两个身份验证提供程序,一个使用 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 Security 可以做到这一点吗?

【问题讨论】:

【参考方案1】:

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

public Authentication authenticate(Authentication authentication) throws AuthenticationException

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

【讨论】:

这就是我所做的。查看源代码,ProviderManager 实现不允许我只使用 XML 配置来做我想做的事情。

以上是关于如何在 Spring Security 的同一个请求中使用两个身份验证提供程序?的主要内容,如果未能解决你的问题,请参考以下文章

请解释spring MVC,hibernate和Spring security

如何在 Struts 2 上应用 Spring Security

如何在 Spring Security 中的 SSO 登录后重定向我的上一页?

如何从多个服务器获取与 Spring Security 和 Spring Session 相同的会话

Spring Security问题

登录后spring security重定向不正确