Безопасная конечная точка Spring с только учетными данными клиента (базовая версия) - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть сервер авторизации oauth2 с одной настраиваемой конечной точкой (выйдите из системы определенного пользователя вручную как администратор). Я хочу, чтобы эта конечная точка была защищена с помощью учетных данных остальных клиентов (идентификатор клиента и секретный как значение заголовка в кодировке Basic), аналогично / oauth / check_token.

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

  1. Мне нужно проверить, аутентифицирован ли клиент.
  2. Я хотел быбыть в состоянии добавить @PreAuthorize ("# oauth2.hasScope ('TEST_SCOPE')") к методу контроллера.

Я не смог найти никаких документов или способов использования механизма Springдля проверки подлинности клиента.

РЕДАКТИРОВАТЬ 1

Я использую конфигурацию Java, а не XML

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Итак, я остановился на следующем решении

Диспетчер аутентификации

public class ClientAuthenticationManager implements AuthenticationManager {

private ClientDetailsService clientDetailsService;
private PasswordEncoder passwordEncoder;

public HGClientAuthenticationManager(ClientDetailsService clientDetailsService, PasswordEncoder passwordEncoder) {
    Assert.notNull(clientDetailsService, "Given clientDetailsService must not be null!");
    Assert.notNull(passwordEncoder, "Given passwordEncoder must not be null!");
    this.clientDetailsService = clientDetailsService;
    this.passwordEncoder = passwordEncoder;
}

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    ClientDetails clientDetails = null;
    try {
        clientDetails = this.clientDetailsService.loadClientByClientId(authentication.getPrincipal().toString());
    } catch (ClientRegistrationException e) {
        throw new BadCredentialsException("Invalid client id or password");
    }
    if (!passwordEncoder.matches(authentication.getCredentials().toString(), clientDetails.getClientSecret())) {
        throw new BadCredentialsException("Invalid client id or password");
    }
    return new OAuth2Authentication(
            new OAuth2Request(null, clientDetails.getClientId(), clientDetails.getAuthorities(), true,
                    clientDetails.getScope(), clientDetails.getResourceIds(), null, null, null),
            null);
}
}

Объявление фильтра

    private BasicAuthenticationFilter basicAuthenticationFilter() {
    ClientDetailsUserDetailsService clientDetailsUserDetailsService = new ClientDetailsUserDetailsService(
            this.clientDetailsService);
    clientDetailsUserDetailsService.setPasswordEncoder(this.passwordEncoder);
    return new BasicAuthenticationFilter(
            new ClientAuthenticationManager(this.clientDetailsService, this.passwordEncoder));
}

Регистрация фильтра

httpSecurity.addFilterBefore(this.basicAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)

ВНИМАНИЕ !!!Это предотвратит любые другие типы аутентификации (oauth2 и т. Д.). ТОЛЬКО Basic аутентификация принята и ТОЛЬКО для зарегистрированных клиентов.

0 голосов
/ 02 октября 2018

@PreAuthorize("#oauth2.hasScope('TEST_SCOPE')") На контроллере метод должен быть достаточным.Если клиент не аутентифицирован, ни одна область не доступна, и проверка области не удастся.

Если вы хотите, вы можете использовать выражение Spring Security @PreAuthorize("isAuthenticated()"), чтобы проверить, аутентифицирован ли клиент: https://docs.spring.io/spring-security/site/docs/5.0.0.RELEASE/reference/htmlsingle/#el-common-built-in

Вы также можете настроить HttpSecurity вместо работы с @PreAuthorize

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