Загрузить ключ подписи JWT из динамической базы - PullRequest
0 голосов
/ 07 декабря 2018

Я развернул Сервер авторизации, используя AuthorizationServerConfigurerAdapter, а пользователи и клиенты настроены на реализацию служб UserDetailsService и ClientDetailsService, которые собирают необходимую информацию в базе данных.

@Configuration
@EnableAuthorizationServer
public class OAuth2JwtAuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

        @Autowired
        @Qualifier("authenticationManagerBean")
        private AuthenticationManager authenticationManager;

        @Autowired
        private  UserDetailsService userDetailsService;

        @Autowired
        private AppClientDetailsService clientDetailsService;

        @Override
        public void configure(final AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
            oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");
        }

        @Override
        public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {          
            clients.withClientDetails(clientDetailsService);
        }

        @Bean
        @Primary
        public DefaultTokenServices tokenServices() {
            final DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
            defaultTokenServices.setTokenStore(tokenStore());
            defaultTokenServices.setSupportRefreshToken(true);
            return defaultTokenServices;
        }

        @Override
        public void configure(final AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
            final TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
            tokenEnhancerChain.setTokenEnhancers(Arrays.asList(tokenEnhancer(), accessTokenConverter()));

            endpoints.tokenStore(tokenStore())
            .tokenEnhancer(tokenEnhancerChain)
            .reuseRefreshTokens(false)
            .userDetailsService(userDetailsService)
            .authenticationManager(authenticationManager);
        }

        @Bean
        public TokenStore tokenStore() {
            return new JwtTokenStore(accessTokenConverter());
        }

        @Bean
        public JwtAccessTokenConverter accessTokenConverter() {
            final JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
            converter.setSigningKey("123");

            return converter;
        }

        @Bean
        public TokenEnhancer tokenEnhancer() {
            return new CustomTokenEnhancer();
        }

        @Bean
        public BCryptPasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
}

Сервер авторизации работает нормально, но я бы хотел, чтобы ключ подписи, установленный в методе accessTokenConverter (), загружался динамически, когда я получаю запрос на новый токен, я получаю доступ к базе данных и изменяю ключ подписи на этом этапе ивернуть токен JWT с этой новой измененной подписью, в настоящее время он настраивается только в момент запуска приложения.

1 Ответ

0 голосов
/ 25 декабря 2018

Вы можете определить свойство @Autowired JwtAccessTokenConverter и изменить его ключ в любой точке

@Autowired
public JwtAccessTokenConverter tokenConverter;

public void setSigningKey(String key) {
    tokenConverter.setSigningKey(key);
}
...