Spring OAuth2 - Как использовать тип предоставления `password` и` client_credentials` вместе, но с разным временем истечения - PullRequest
0 голосов
/ 28 января 2019

Я использую Spring Security OAuth2 для реализации аутентификации между моим веб-приложением и центральным сервером авторизации.Я использую тип гранта password и client_credentials вместе.Веб-приложение использует токен client_credentials, когда пользователь еще не вошел в систему, и токен password, когда пользователь уже вошел в систему.

Для токена password я установил время истечения, чтобы оно былокоротко и предоставьте токен обновления на длительный срок для обновления токена доступа.Конфигурация времени истечения выполняется путем изменения значения столбца access_token_validity в таблице oauth_client_details.

| client_id |           authorized_grant_types          | access_token_validity |
----------------------------------------------------------------------------------
 my_web_app   password,refresh_token,client_credentials           900

Но для токена client_credentials я хочу сделать так, чтобы он никогда не истек.Но Spring использует значение в access_token_validity для обоих типов токенов.

Как я могу установить access_token_validity отдельно для 2 типов токенов?

1 Ответ

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

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

Сначала добавьте { "client_token_validity": 2000000000 } в столбец additional_information в таблице oauth_client_details

|    client_id    |              authorized_grant_types                  |     access_token_validity     |       additional_information
----------------------------------------------------------------------------------------------------------------------------------------------------------
 my_web_app            password,refresh_token,client_credentials                   900                         { "client_token_validity": 2000000000 }

Затем расширьтеDefaultTokenServices, переопределяя метод getAccessTokenValiditySeconds, чтобы прочитать вышеуказанную дополнительную информацию.

@Autowired
private DataSource dataSource;

@Bean
public ClientDetailsService clientDetailsService() {
    return new JdbcClientDetailsService(dataSource);
}

@Bean
@Primary
public DefaultTokenServices tokenServices() {
    MyJwtTokenService myJwtTokenService = new MyJwtTokenService(tokenBlackListService);
    tokenServices.setClientDetailsService(clientDetailsService());
    return myJwtTokenService;
}

public class MyJwtTokenService extends DefaultTokenServices {
    private ClientDetailsService clientDetailsService;

    @Override
    public void setClientDetailsService(ClientDetailsService clientDetailsService) {
        this.clientDetailsService = clientDetailsService;
        super.setClientDetailsService(clientDetailsService);
    }

    @Override
    protected int getAccessTokenValiditySeconds(OAuth2Request clientAuth) {
        String grantType = clientAuth.getGrantType();
        if ("client_credentials".equals(grantType)) {
            ClientDetails client = this.clientDetailsService.loadClientByClientId(clientAuth.getClientId());
            Object clientTokenValidity = client.getAdditionalInformation().get("client_token_validity");
            if (clientTokenValidity != null) {
                return (int) clientTokenValidity;
            }
        }

        return super.getAccessTokenValiditySeconds(clientAuth);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...