Spring Security - 在运行时在身份验证提供者之间切换(本地数据库或远程 LDAP)

Posted

技术标签:

【中文标题】Spring Security - 在运行时在身份验证提供者之间切换(本地数据库或远程 LDAP)【英文标题】:Spring Security - Switch between Authentication Providers at Runtime (local database OR remote LDAP) 【发布时间】:2016-02-07 08:04:00 【问题描述】:

我目前正在使用 Spring MVC Web 应用程序,我们一直在通过本地数据库使用由 spring security 提供的 AbstractUserDetailsAuthenticationProvider 类的 impl 进行身份验证。

但是,为了进一步保护应用程序,我们决定允许用户通过 LDAP/AD 服务器进行身份验证。这不是一项要求,用户可以选择在门户本身的配置中启用此功能。

想知道如何真正实现这一点。找到了AbstractLdapAuthenticationProvider。然而,仅仅将这个额外的身份验证提供程序添加到身份验证管理器是不够的,因为天气是否应该在运行时由数据库中的标志确定。

非常感谢您在这方面的任何帮助。

感谢阅读:)

【问题讨论】:

看看这个问题及其答案,应该可以帮助您入门:***.com/questions/21381893/… 【参考方案1】:

有两个身份验证提供程序,一个用于本地数据库,一个用于 LDAP。 Spring 身份验证管理器将在每个提供者中调用public boolean supports(Class authentication) 方法,以查看提供者是否支持提供的 Authentication 类。因此,supports(Class authentication) 方法是您编写自己的自定义逻辑以启用/禁用特定身份验证提供程序的理想场所。

【讨论】:

【参考方案2】:

可能有多种方法可以做到这一点,但一种简单的方法是为身份验证管理器设置两个身份验证提供程序,首先是本地数据库的身份验证提供程序,其次是 LDAP 身份验证提供程序。

要在运行时跳过 LDAP 检查,请从本地数据库提供程序中抛出 AccountStatusException(它的子类,因为抽象)。这使身份验证管理器跳过更多提供程序,在您的情况下为 LDAP。

如果您想为用户设置相反的密码,请将密码设置为空白或本地数据库中的随机值。

【讨论】:

嗨 holmis83 感谢您的回复!只是想知道我是否在身份验证管理器下添加了一个身份验证提供程序链,当我抛出 AccountStatusException 的 impl 时,我的登录是否会全部失效?! @jiachen 是的,那将完全通过身份验证。

以上是关于Spring Security - 在运行时在身份验证提供者之间切换(本地数据库或远程 LDAP)的主要内容,如果未能解决你的问题,请参考以下文章

在corda中使用spring security的基本身份验证

使用 UserDetailsS​​ervice 的 Spring Security 身份验证

如何在运行时在 spring-SAML 中添加新的 idp 元数据

Spring Security Active Directory LDAP 身份验证错误

Spring Security 通过 post 对用户进行身份验证

Spring Security基础原理