Spring Security - переключение между поставщиками аутентификации во время выполнения (локальная база данных ИЛИ удаленный LDAP)

В настоящее время я работаю над веб-приложением Spring MVC, и мы использовали аутентификацию через локальную базу данных с внедрением класса AbstractUserDetailsAuthenticationProvider, предоставляемого Spring security.

Однако для дополнительной защиты приложения мы решили разрешить пользователям аутентифицироваться через сервер LDAP / AD. Это не является обязательным требованием, и пользователи могут включить это в настройках самого портала.

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

Был бы очень признателен за любую помощь в этой области.

Спасибо за прочтение:)


person jia chen    schedule 06.11.2015    source источник
comment
Посмотрите на этот вопрос и ответ на него, с которого вы должны начать: stackoverflow.com/questions/21381893/   -  person yglodt    schedule 03.05.2016


Ответы (2)


Вероятно, существует несколько способов сделать это, но простой подход состоит в том, чтобы иметь двух поставщиков аутентификации для диспетчера аутентификации, сначала поставщика аутентификации для локальной базы данных, а затем поставщика аутентификации LDAP.

Чтобы пропустить проверку LDAP во время выполнения, выбросьте AccountStatusException (его подкласс, начиная с абстрактного) из вашего локального поставщика базы данных. Это заставляет диспетчер аутентификации пропускать других поставщиков, в вашем случае LDAP.

Если вы хотите, чтобы для пользователя было наоборот, установите для пароля пустой или случайное значение в локальной базе данных.

person holmis83    schedule 06.11.2015
comment
Привет, holmis83, спасибо за ответ !! просто интересно, если я добавлю цепочку поставщиков аутентификации вместе в диспетчере аутентификации, и когда я выброшу impl of AccountStatusException, это приведет к аннулированию моего входа в систему все вместе ?! - person jia chen; 09.11.2015
comment
@jiachen да, это вообще не приведет к аутентификации. - person holmis83; 09.11.2015

Имейте два провайдера аутентификации, один для локальной базы данных и один для LDAP. Диспетчер проверки подлинности Spring вызовет метод public boolean supports(Class authentication) в каждом из поставщиков, чтобы узнать, поддерживает ли поставщик предоставленный класс проверки подлинности. Таким образом, метод supports(Class authentication) - идеальное место для вас, чтобы написать свою собственную логику для включения / отключения определенного поставщика аутентификации.

person Chao    schedule 11.01.2016