Spring Security - переопределить метод TokenEndpoint по умолчанию (/ oauth / token) - PullRequest
0 голосов
/ 31 декабря 2018

Я планирую реализовать oauth2 & JWT в моем новом проекте.Помимо имени пользователя, пароля и grant_type, у меня есть еще несколько полей для проверки перед предоставлением access_token и refresh_token.Поэтому я планирую переопределить реализацию метода TokenEndpoint's postAccessToken по умолчанию.Было бы возможно, если да, что обо всем, что я должен заботиться?И это правильная идея переопределить реализацию по умолчанию?Например, ниже находится подпись TokenEndpoint postAccessToken.

public ResponseEntity<OAuth2AccessToken> postAccessToken(Principal principal, @RequestParam Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {
....
}

Здесь, до достижения метода postAccessToken, только Spring-Security построил объект Principal.

Моя конечная точка выглядела бы так, где нет объекта Principal(Не знаю, какую проблему это вызовет в будущем.)

1 Ответ

0 голосов
/ 31 декабря 2018
Apart from username, password & grant_type, I am having a few another fields to validate before granting the access_token and refresh_token.

Поскольку у вас есть дополнительные поля для проверки типа предоставления пароля, это больше не тип предоставления пароля.Поэтому не рекомендуется изменять поведение по умолчанию, изменяя TokenEndpoint.Что вы можете сделать, это написать кастом TokenGranter.

Посмотрите на ResourceOwnerPasswordTokenGranter , который является реализацией для типа предоставления пароля.Основываясь на этом, вы можете написать CustomResourceOwnerPasswordTokenGranter, как показано ниже:

public class CustomResourceOwnerPasswordTokenGranter extends ResourceOwnerPasswordTokenGranter {

private static final String GRANT_TYPE = "custom-password";

private final AuthenticationManager authenticationManager;

public CustomResourceOwnerPasswordTokenGranter(AuthenticationManager authenticationManager,
        AuthorizationServerTokenServices tokenServices, ClientDetailsService clientDetailsService, OAuth2RequestFactory requestFactory) {
    this(authenticationManager, tokenServices, clientDetailsService, requestFactory, GRANT_TYPE);
}

protected CustomResourceOwnerPasswordTokenGranter(AuthenticationManager authenticationManager, AuthorizationServerTokenServices tokenServices,
        ClientDetailsService clientDetailsService, OAuth2RequestFactory requestFactory, String grantType) {
    super(tokenServices, clientDetailsService, requestFactory, grantType);
    this.authenticationManager = authenticationManager;
}

@Override
protected OAuth2Authentication getOAuth2Authentication(ClientDetails client, TokenRequest tokenRequest) {

    Map<String, String> parameters = new LinkedHashMap<String, String>(tokenRequest.getRequestParameters());
    String username = parameters.get("username");
    String password = parameters.get("password");

    // You can use parameters.get to read your custom parameter fields

    ...

}

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

И, наконец, вы регистрируете реализацию CustomResourceOwnerPasswordTokenGranter, используя следующую конфигурацию Java.

public TokenGranter tokenGranter() {

        ClientDetailsService clientDetails = clientDetailsService;
        AuthorizationServerTokenServices tokenServices = tokenServices();
        AuthorizationCodeServices authorizationCodeServices = authorizationCodeServices();
        OAuth2RequestFactory requestFactory = requestFactory();

        List<TokenGranter> tokenGranters = new ArrayList<TokenGranter>();

        tokenGranters.add(new AuthorizationCodeTokenGranter(tokenServices, authorizationCodeServices,
                clientDetails, requestFactory));
        tokenGranters.add(new RefreshTokenGranter(tokenServices, clientDetails, requestFactory));
        tokenGranters.add(new ImplicitTokenGranter(tokenServices, clientDetails, requestFactory));
        tokenGranters.add(new ClientCredentialsTokenGranter(tokenServices, clientDetails, requestFactory));
        tokenGranters.add(new ResourceOwnerPasswordTokenGranter(authenticationManager, tokenServices,
                    clientDetails, requestFactory));
        tokenGranters.add(new CustomTokenGranter(authenticationManager, tokenServices(), clientDetailsService,
                requestFactory));
        // Register the CustomResourceOwnerPasswordTokenGranter here
        tokenGranters.add(new CustomResourceOwnerPasswordTokenGranter(authenticationManager, tokenServices,
                    clientDetails, requestFactory));

        return new CompositeTokenGranter(tokenGranters);
}

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {

    endpoints
            .tokenServices(tokenServices())
            .tokenStore(tokenStore())
            .tokenEnhancer(tokenEnhancer())
            .authorizationCodeServices(authorizationCodeServices())
            .userApprovalHandler(userApprovalHandler())
            .authenticationManager(authenticationManager)
            .requestFactory(requestFactory())
            .tokenGranter(tokenGranter());
}

Наконец, вы можете отправить запрос POST на /oauth/token с параметрами grant_type=custom-password&username=<Username>&password=<Password>&customFieldOne=1&customFieldTwo=2 и вызвать свой пользовательскийосуществление.

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