Создайте пользователя при входе в систему с помощью Spring Security

Как мы можем переносить пользователей из одной базы данных в другую, используя Spring Security, «на лету» и прозрачно для пользователя?

Фон

Мы используем Spring Security с аутентификацией на основе форм в нашем веб-приложении. В нашей конфигурации используются стандартные компоненты Spring JDBC, поддерживаемые пользовательской базой данных. Однако у нас также есть другая пользовательская база данных из старой системы, в которой число пользователей примерно в десять раз больше, чем в новой. Мы хотим, чтобы пользователи старой базы данных также могли входить в систему. Для пользователя это должно быть абсолютно прозрачно.

Поскольку большинство пользователей в старой базе данных больше не активны, мы не хотим переносить их всех в новую базу данных. Из соображений производительности мы хотим, чтобы новая база данных пользователей была как можно меньше, но при этом содержала всех активных пользователей. Через некоторое время мы хотели бы отключить старую базу данных пользователей, фактически удалив всех неактивных пользователей.

Идея, которую мы придумали, заключается в том, чтобы мигрировать пользователей по требованию. Когда несуществующий пользователь (не в новой базе данных) пытается войти в систему, мы хотим проверить, может ли пользователь пройти аутентификацию в старой пользовательской базе данных, и в этом случае перенести пользователя в новую базу данных и автоматически войти в систему.

В фреймворке Spring Security есть много точек расширения, вопрос в том, какие из них подойдут для наших целей?


person Jon Ekdahl    schedule 18.01.2013    source источник


Ответы (1)


Я думаю, что лучшее место — org.springframework.security.authentication.AuthenticationManager. Вы можете подготовить два разных экземпляра AuthenticationProvider (для новой и старой баз данных). Если вы введете их в AuthenticationManager по умолчанию (на самом деле это класс ProviderManager), тогда он будет выполнять итерацию через обоих провайдеров и даст вам первый успешный результат аутентификации. Ваш пользовательский AuthenticationManager будет иметь немного другую логику:

  • он будет знать разницу между двумя провайдерами
  • в первую очередь он проверит новую базу данных
  • в случае BadCredentialsException он будет проверять старую базу данных
  • если пользователь аутентифицирован через старую базу данных, он скопирует записи учетной записи
  • будет хорошей идеей отозвать первый AuthenticationProvider, чтобы убедиться, что все в порядке
person Maksym Demidas    schedule 18.01.2013
comment
Максим, спасибо! Попробуем ваш подход. - person Jon Ekdahl; 21.01.2013