2015-03-29 3 views
0

Итак, я могу получить токен доступа со всеми стандартными CURL, но как только я попытаюсь получить токен доступа, приложение выдает «IllegalStateException - UserDetailsService Required». Насколько я знал, нам не нужно снова проверять данные пользователя, как только мы обновим токен? Но в любом случае он должен быть там, так или иначе, учитывая, что он должен аутентифицироваться для токена доступа в первый раз.Spring Boot Oauth2 Обновить токен - IllegalStateException

Смотрите ниже моей oauth2 конфигурации:

@Configuration 
public class OAuth2Config { 

@Configuration 
@EnableResourceServer 
protected static class ResourceServiceConfig extends ResourceServerConfigurerAdapter { 

    @Autowired 
    private TokenStore tokenStore; 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http 
      .authorizeRequests() 
      .antMatchers("/oauth/token/").permitAll() 
      .antMatchers(HttpMethod.GET, "/api/**").access("#oauth2.hasScope('read')") 
      .antMatchers(HttpMethod.OPTIONS, "/api/**").access("#oauth2.hasScope('read')") 
      .antMatchers(HttpMethod.POST, "/api/**").access("#oauth2.hasScope('write')") 
      .antMatchers(HttpMethod.PUT, "/api/v1/**").access("#oauth2.hasScope('write')") 
      .antMatchers(HttpMethod.PATCH, "/api/**").access("#oauth2.hasScope('write')") 
      .antMatchers(HttpMethod.DELETE, "/api/**").access("#oauth2.hasScope('write')"); 
    } 

    @Override 
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception { 
     resources 
      .resourceId(<RESOURCE ID>) 
      .tokenStore(tokenStore); 
    } 
} 

@Configuration 
@EnableAuthorizationServer 
protected static class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { 

    @Value("${oauth.clientid}") 
    private String CLIENT_ID; 

    @Value("${oauth.clientsecret}") 
    private String CLIENT_SECRET; 

    @Value("${oauth.tokenvalidity}") 
    private String VALIDITY_SECONDS; 

    @Autowired 
    private DataSource dataSource; 

    @Autowired 
    private BCryptPasswordEncoder passwordEncoder; 

    @Bean 
    public TokenStore tokenStore() { 
     return new JdbcTokenStore(dataSource); 
    } 

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

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

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
     clients 
      .withClient(CLIENT_ID) 
      .scopes("read", "write") 
      .authorities(Authorities.USER) 
      .authorizedGrantTypes("password", "refresh_token") 
      .secret(CLIENT_SECRET) 
      .accessTokenValiditySeconds(Integer.parseInt(VALIDITY_SECONDS)); 
    } 

} 
} 

и Web Security Config:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

@Autowired 
private CustomUserDetailsService userDetailsService; 

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


@Override 
protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
    auth 
     .userDetailsService(userDetailsService) 
     .passwordEncoder(passwordEncoder()); 
} 

@Override 
@Bean 
public AuthenticationManager authenticationManagerBean() throws Exception { 
    return super.authenticationManagerBean(); 
} 

@Override 
public void configure(HttpSecurity http) throws Exception { 
    http 
     .csrf().disable() 
     .authorizeRequests().anyRequest().permitAll(); 
} 

} 

Так Да это один, кажется, не имеет смысла, потому что 1. почему он даже собирается для когда пользователь пытается обновить токен? и 2. почему он не может найти службу пользовательских данных в любом случае, когда он явно там, и заранее работает над предоставлением пароля?

Благодаря

ответ

0

Найдено ответ здесь: https://github.com/spring-projects/spring-security-oauth/blob/master/tests/annotation/jdbc/src/main/java/demo/Application.java#L136

Я добавил это как еще один внутренний класс в моем классе OAuth конфигурации, и удалить любой менеджер аутентификации/пароль кодировщик конфигурации из класса Web Security Config, буквально Единственное, что осталось на данный момент, - это @Override в функции configure (HttpSecurity http).

@Configuration 
@Order(Ordered.LOWEST_PRECEDENCE - 20) 
protected static class AuthenticationManagerConfiguration extends GlobalAuthenticationConfigurerAdapter { 

    @Autowired 
    private DataSource dataSource; 

    @Autowired 
    private CustomUserDetailsService userDetailsService; 

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

    @Override 
    public void init(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
      .userDetailsService(userDetailsService) 
      .passwordEncoder(passwordEncoder()); 
    } 

} 

Как автор решения комментариев «Глобальная конфигурация аутентификации упорядоченной после тот, в Spring ботинке (так здесь настройки перезаписывают те, в ботинке).» Хотя он также упоминает, что это не будет проблемой весной загрузки 1.2.3 в любом случае, но на данный момент это то, что мне нужно, чтобы заставить его работать и найти мой UserDetailsService.

0

В классе AuthorizationServerConfig:

@Autowired 
private CustomUserDetailsService userDetailsService; 

@Override 
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
    endpoints 
     .authenticationManager(authenticationManager) 
     .tokenStore(tokenStore()) 
     .userDetailsService(userDetailsService); 
} 
Смежные вопросы