Поток учетных данных клиента Oauth2 + сброс Spring Boot2 Нет сопоставленного PasswordEncoder> для ошибки с идентификатором «null» - PullRequest
0 голосов
/ 20 февраля 2019

Я обновляю существующие учетные данные клиента Oauth2 для использования весенней загрузки 2.Сервер авторизации использует обычную аутентификацию с кодировкой Base64 (client:secret)Я использую RedisTokenStore для хранения токенов.Я борюсь с конфигурацией, необходимой для конфигурации Oauth2 с новым обновлением.Я не мог найти надлежащую документацию, которая указывает мне на поток учетных данных клиента.При обновлении Spring 5 Security кодирование пароля не выполняется, я получаю: -

java.lang.IllegalArgumentException: не существует PasswordEncoder, сопоставленного с ошибкой id "null"

Ниже приведена моя конфигурация: -

@Configuration
public class WebConfiguration extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
                http.
                        csrf().disable().
                        authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/oauth/token").permitAll();
        }

}

AuthorizationServer и ResourceServer

@Configuration
@EnableAuthorizationServer
public class Oauth2Configuration extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private ClientDetailsService clientDetailsService;

    @Autowired
    private JedisConnectionFactory jedisConnFactory;

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

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(tokenStore());
        super.configure(endpoints);
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.passwordEncoder(passwordEncoder());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        String idForEncode = "bcrypt";
        Map<String, PasswordEncoder> encoderMap = new HashMap<>();
        encoderMap.put(idForEncode, new BCryptPasswordEncoder());
        return new DelegatingPasswordEncoder(idForEncode, encoderMap);
    }

    @Bean
    public TokenStore tokenStore() {
        return new Oauth2TokenStore(jedisConnFactory);
    }

    @Configuration
    @EnableResourceServer
    protected static class ResourceServer extends ResourceServerConfigurerAdapter {

        @Override
        public void configure(HttpSecurity http) throws Exception {
            http
                    .authorizeRequests()
                    .antMatchers("/verify_token").authenticated()
                    .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                    .antMatchers(HttpMethod.GET, "/info").permitAll()
                    .antMatchers(HttpMethod.GET, "/health").permitAll();
        }
    }
}

RedisTokenStore

public class Oauth2TokenStore extends RedisTokenStore {
    @Autowired
    private ClientDetailsService clientDetailsService;


    public Oauth2TokenStore(RedisConnectionFactory connectionFactory) {
        super(connectionFactory);
    }

    @Override
    public void storeAccessToken(OAuth2AccessToken token, OAuth2Authentication authentication) {
        Object principal = authentication.getPrincipal();

        //Principal is consumer key since we only support client credential flow
        String consumerKey = (String) principal;

        //get client detials
        ClientDetails clientDetails = clientDetailsService.loadClientByClientId(consumerKey);


        // Logic to Create JWT
        .
        .
        .
        //Set it to Authentication
        authentication.setDetails(authToken);

       super.storeAccessToken(token, authentication);
    }

    @Override
    public OAuth2Authentication readAuthentication(String token) {
        OAuth2Authentication oAuth2Authentication =  super.readAuthentication(token);
        if (oAuth2Authentication == null) {
            throw new InvalidTokenException("Access token expired");
        }
        return oAuth2Authentication;
    }
}
}

Также мне нужно кодировать токен приЯ храню в Redis Store после обновлений для кодировки паролей безопасности Spring?

1 Ответ

0 голосов
/ 20 февраля 2019

Эта ошибка означает, что сохраненный пароль не имеет префикс типа пароля.

Например, ваши хешированные пароли могут выглядеть примерно так:

$2a$10$betZ1XaM8rTUQHwWS.cyIeTKJySBfZsmC3AYxYjwa4fHtr6i/.9oG

Но Spring Security теперь ожидает:

{bcrypt}$2a$10$betZ1XaM8rTUQHwWS.cyIeTKJySBfZsmC3AYxYjwa4fHtr6i/.9oG

У вас в основном дваварианты .Во-первых, настройте DelegatingPasswordEncoder на то, что должно быть по умолчанию:

@Bean
public PasswordEncoder passwordEncoder() {
    String idForEncode = "bcrypt";
    BCryptPasswordEncoder bcrypt = new BCryptPasswordEncoder();
    Map<String, PasswordEncoder> encoderMap = 
        Collections.singletonMap(idForEncode, bcrypt);
    DelegatingPasswordEncoder delegating =
        new DelegatingPasswordEncoder(idForEncode, encoderMap);
    delegating.setDefaultPasswordEncoderForMatches(bcrypt);
    return delegating;
}

Или, во-вторых, выполните пакетное обновление вашего хранилища паролей (с префиксом {bcrypt}).

Я не уверен, откуда твой ClientDetailsService тянет, но я бы начал искать там.

ОБНОВЛЕНИЕ : Тем не менее, предполагается, что ваши существующие пароли зашифрованы.Если это не так, то вы должны указать любой кодер:

@Bean
public PasswordEncoder passwordEncoder() {
    String idForEncode = "bcrypt";
    PasswordEncoder existing = new MyPasswordEncoder();
    PasswordEncoder updated = new BCryptPasswordEncoder();
    Map<String, PasswordEncoder> encoderMap = 
        Collections.singletonMap(idForEncode, updated);
    DelegatingPasswordEncoder delegating =
        new DelegatingPasswordEncoder(idForEncode, encoderMap);
    delegating.setDefaultPasswordEncoderForMatches(existing);
    return delegating;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...