如何在 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 登录后重定向我的上一页?