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

Spring Security - Switch between Authentication Providers at Runtime (local database OR remote LDAP)

我目前正在使用 Spring MVC 网络应用程序,我们一直在通过本地数据库使用身份验证,并提供了 AbstractUserDetailsAuthenticationProvider class通过 spring 安全。

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

想知道如何实际执行此操作。已找到 AbstractLdapAuthenticationProvider。但是,仅仅将这个额外的身份验证提供程序添加到身份验证管理器是不够的,因为天气是否应该存在,应该在运行时通过数据库中的标志来确定。

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

感谢阅读:)

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

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

如果您想要用户的另一种方式,请将密码设置为空白或本地数据库中的随机值。

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