1

我们如何使用 Spring Security 将用户从一个数据库迁移到另一个数据库,即时且对用户透明?

背景

我们在 Web 应用程序中使用 Spring Security 和基于表单的身份验证。我们的配置使用由用户数据库支持的标准 Spring JDBC 组件。但是,我们还有另一个来自旧系统的用户数据库,与新系统相比,它的用户数量大约是新系统的十倍。我们也希望允许旧数据库中的用户登录。对于用户来说,这应该是完全透明的。

由于旧数据库中的大多数用户不再处于活动状态,我们不想将它们全部迁移到新数据库中。出于性能原因,我们希望保持新用户数据库尽可能小,同时仍包含所有活动用户。一段时间后,我们想断开旧用户数据库,有效地删除所有非活动用户。

我们提出的想法是按需迁移用户。当不存在的用户(不在新数据库中)尝试登录时,我们要检查用户是否可以针对旧用户数据库进行身份验证,在这种情况下,将用户迁移到新数据库并自动登录。

Spring Security 框架中有很多扩展点,问题是哪些适合我们的目的?

4

1 回答 1

0

我认为最好的地方是 org.springframework.security.authentication。身份验证管理器。您可以准备两个不同的 AuthenticationProvider 实例(用于新旧数据库)。如果您将它们注入到默认的 AuthenticationManager 中(实际上它是 ProviderManager 类),那么它将遍历两个提供者并为您提供第一个成功的身份验证结果。您的自定义 AuthenticationManager 将具有稍微不同的逻辑:

  • 它会知道两个提供者之间的区别
  • 首先它将检查新数据库
  • 在 BadCredentialsException 的情况下,它将检查旧数据库
  • 如果用户通过旧数据库进行身份验证,那么它将复制帐户记录
  • 最好回忆一下第一个 AuthenticationProvider 以确保一切正常
于 2013-01-18T16:58:30.230 回答