spring-security: несколько провайдеров аутентификации для веб-приложения spring-mvc - PullRequest
0 голосов
/ 08 июля 2019

Я бы хотел расширить существующий механизм аутентификации Spring-Security.

Существующая реализация состоит из двух AuthenticationProvider s:

  • стандарт DaoAuthenticationProvider (делегирование UserDetailsService)
  • пользовательскому AuthenticationProvider

(каждый из которых охватывает свой сценарий аутентификации)

Я хочу включить другое условие входа («3-й провайдер»).Затем пользователь должен будет пройти авторизацию любым из вышеперечисленных провайдеров, а также это новое условие.

Я понимаю, что AuthenticationProvider s дополняют друг друга.Если первый сбой, аутентификация передается следующему провайдеру.Это хорошо для двух существующих провайдеров, но не работает с третьим провайдером.

Если я назначу третьего провайдера последним <authentication-provider>, он не будет вызван, если пользователь был аутентифицирован одним из предыдущих провайдеров.Поместите это как первое, и даже если это не проходит аутентификацию, другие провайдеры все еще будут вызваны.Единственный способ прервать цепочку провайдеров, который я вижу, - бросить AccountStatusException.Так как же AuthenticationProvider может сказать next-in-line не запускаться?

Цени руководство.Спасибо.

Использование пружинной защиты 4.

1 Ответ

0 голосов
/ 10 июля 2019

Вы можете просто решить эту проблему, внедрив пользовательский AuthenticationProvider, который внутренне содержит эти 3 AuthenticationProvider. Таким образом, вы можете свободно применять любую логику, чтобы решить, как делегировать запрос, которому AuthenticationProvider обрабатывать, и логике последовательностей аутентификации и т. Д. В соответствии с вашими бизнес-правилами.

Что-то вроде ниже:

public class MyAuthenticationProvider{


     private DaoAuthenticationProvider existingDaoAuthenticationProvider;
     private AuthenticationProvider existingCustomAuthenticationProvider;
     private AuthenticationProvider newCustomAuthenticationProvider;


     public Authentication authenticate(Authentication authentication) throws AuthenticationException{

         String checkingResult = checkDBForUserAuthentication(authentication);

         if(checkingResult == "foo"){
             existingDaoAuthenticationProvider.authenticate(authentication);
         }else if(checkingResult == "bar"){
             existingCustomAuthenticationProvider.authenticate(authentication);
         }else{
            //Another checking satisfy.......
            newCustomAuthenticationProvider().authenticate(authentication);

         }
     }
}

И убедитесь, что вы регистрируете только это AuthenticationProvider.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...