В конкретном пути используйте имя пользователя / пароль аутентификации - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть весенний проект с настроенной рабочей безопасностью, и я пытаюсь настроить конкретный путь, который будет принимать вызовы REST с простой аутентификацией пользователя / пароля, которая может быть жестко задана.

Я знаю, что это немного странный случай, но у меня есть очень конкретный вариант использования для этого.

Код безопасности выглядит следующим образом:

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
        ...
        .and()
            .authorizeRequests()
            .antMatchers("my-path/**").authenticated()
    }

Я не очень понимаю, как весна делает всю магию, но мне бы хотелось, чтобы это выглядело примерно так:

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
        ...
        .and()
            .authorizeRequests()
            .antMatchers("my-path/**").authenticatedWithUserPassword("user", "pswd")
    }

2 вещи, которые должны произойти:

  • Я хочу, чтобы этот пользователь / pswd работал только для этого пути и только для этого пути!
  • Я хочу, чтобы этот путь работал только для этого пользователя / pswd и ни для каких других типов аутентификации!

1 Ответ

0 голосов
/ 29 апреля 2019

Хорошо, поэтому я немного взломал (вдохновленный этим ответом ), но это решило проблему для меня.

Сначала я создал это AuthenticationProvider:

public class ClusterInternalAuthenticationProvider implements AuthenticationProvider {

    public static final String USER = "...";
    public static final String PASSWORD = "...";

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken)authentication;

        Object principal = token.getPrincipal();
        Object credentials = token.getCredentials();

        if (principal.equals(USER) && credentials.equals(PASSWORD)) {
            return new UsernamePasswordAuthenticationToken(
                principal,
                credentials,
                Collections.singletonList(new SimpleGrantedAuthority("RELEVANT_AUTHORITY"))
            );
        }

        throw new BadCredentialsException("Sorry mate, wrong credentials...");
    }

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

Это пробует комбо user / pswd, и если true возвращает учетные данные с правами, которые мне потребуются для доступа к определенному пути.

Далее, в SecurityConfiguration я включаю httpBasic и добавляю свой AuthenticationProvider:

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
        ...
        .and()
            .authorizeRequests()
            .antMatchers("my-path/**").hasAuthority("RELEVANT_AUTHORITY")
        .and()
            .httpBasic()
        .and()
            .authenticationProvider(new ClusterInternalAuthenticationProvider());
    }

Кажется, этого достаточно, но это не "правильное" исправление в том смысле, что мне нужно следить за тем, чтобы не использовать эти полномочия в другом месте, и что оно кажется чрезмерным для такой небольшой потребности - другие решения очень приветствуются.

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