Могу ли я использовать вызов API для аутентификации в другом приложении с помощью Spring Security? - PullRequest
0 голосов
/ 29 января 2019

Я балуюсь Spring Boot.Конечной целью является создание простой панели инструментов, которая предоставляет статистику и примеры для другого веб-приложения, развернутого в Tomcat через.Вызовы API.Вы также можете использовать API для аутентификации через SOAP, что я и хотел бы сделать в настоящее время (через HTTPS).Я смотрел на подобные руководства для Spring Security: https://www.baeldung.com/spring-security-authentication-provider

Мой главный вопрос: подходит ли Spring Security для того, что я пытаюсь сделать?Основываясь на ссылке выше, у меня есть следующий код:

@Component
public class CustomAuthenticationProvider
  implements AuthenticationProvider {

    @Override
    public Authentication authenticate(Authentication authentication) 
      throws AuthenticationException {

        String name = authentication.getName();
        String password = authentication.getCredentials().toString();

        try {

            ApiAuthenticationServiceClient a = new ApiAuthenticationServiceClient();
            a.authenticate(name, password);

            //authentication successful return token
            return new UsernamePasswordAuthenticationToken(
                name, password, new ArrayList<>());

        } catch(ApiAuthenticationException e) {
            //Authentication failed return null
            return null;
        }
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(
          UsernamePasswordAuthenticationToken.class);
    }
}

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

1 Ответ

0 голосов
/ 30 января 2019

Это, безусловно, один из способов приблизиться к этому.В вашем примере предполагается, что вы настроили httpBasic() аутентификацию

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http...
            .httpBasic();
    }

или formLogin() аутентификацию

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http...
            .formLogin();
    }

Каждый из этих сценариев будет вставлять фильтр в фильтрцепь.Эти фильтры будут считывать имя пользователя и пароль из заголовка (http-basic) или параметров HTTP (form-login).Он принимает эти значения и создает UsernamePasswordAuthenticationToken и вызывает ваш пользовательский обработчик.

Вы также можете выполнить это полностью без специального поставщика аутентификации, просто внедрив фильтр

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http...
            .addFilter(new MyCustomFilter());
    }


    public static class MyCustomFilter extends OncePerRequestFilter {
        public void doFilterInternal(HttpServletRequest request,
                                     HttpServletResponse response,
                                     FilterChain chain) {

       if (<should we attempt authentication based on logic> {
           try {
               String username = ...
               String password = ...
               ApiAuthenticationServiceClient a = new ApiAuthenticationServiceClient();
               a.authenticate(name, password);

               //authentication successful return token
              SecurityContextHolder
                  .getContext()
                  .setAuthentication(
                      new UsernamePasswordAuthenticationToken(name, password, new ArrayList<>())
                  );

            } catch(ApiAuthenticationException e) {
                //Authentication failed maybe log it?
            }       
        }
        //continue
        chain.doFilter(request, response);
    }

Тысяча способов обработать скинкошка.Вы выбираете тот, который работает для вас.Подход провайдера аутентификации работает, вам просто нужно знать, что существует фильтр, который создает для вас объект UsernamePasswordAuthenticationToken.Если вы не настроите эти фильтры, вы никогда не получите обратный вызов поставщику аутентификации.

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