2016-02-16 5 views
3

Я пытаюсь настроить сервер OAuth2, который сможет завершить основные потоки OAuth2 (см. Примеры here).Spring Boot OAuth2 с базовой аутентификацией и пользовательскими UserDetailsService

Извиняюсь за длинный вопрос

Моя первая попытка, чтобы быть в состоянии выполнить authorization_code поток.

У меня есть следующая конфигурация:

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) 
public class SecurityConfig 
     extends WebSecurityConfigurerAdapter { 

    .... 

     @Inject 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
      auth 
       .userDetailsService(userDetailsService) 
       .passwordEncoder(passwordEncoder()); 
    } 

... 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       .formLogin().loginPage("/login").permitAll() 
       .and() 
       .requestMatchers().antMatchers("/login", "/oauth/authorize", "/oauth/confirm_access") 
       .and() 
       .authorizeRequests().anyRequest().authenticated(); 
    } 

... 

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

конфигурации моего сервера

@Configuration 
@EnableAuthorizationServer 
public class OAuth2AuthorServerConfig 
     extends AuthorizationServerConfigurerAdapter { 

    @Inject 
    private TokenStore tokenStore; 

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

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

    @Override 
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { 
     security 
      .allowFormAuthenticationForClients() 
      .checkTokenAccess("authenticated()"); 
    } 

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
     .inMemory() 
       .withClient("foo") 
       .secret("foo") 
       .authorizedGrantTypes("authorization_code","password", "refresh_token") 
       .scopes(new String[] { "read", "write" }) 
    } 

И действительно мой код авторизации потока работает нормально! Проблема начинается, когда я пытаюсь сделать поток пароль следующим образом:

POST localhost:8200/oauth/token 
Content-Type: application/x-www-form-urlencoded 
Accept:application/json 
Authorization:Basic Zm9vOmZvbw==" 
username=admin&password=admin&grant_type=password&scope=read%20write&client_secret=foo&client_id=foo& 

Моя проблема заключается в том, что заголовок Authorization игнорируется, является ли он или нет, результат тот же, это дает мне обратно access_token и refresh_token

Если я пытаюсь включить базовую аутентификацию следующим образом, позволяет ClientUserDetailsService, чтение клиентов из базы данных JDBC:

public class SecurityConfig 
     extends WebSecurityConfigurerAdapter { 

    .... 

@Bean 
public ClientDetailsUserDetailsService clientDetailsUserDetailsService(ClientDetailsService clientDetailsService){ 
    // JDBC clientDetailsService 
    return new ClientDetailsUserDetailsService(clientDetailsService); 
} 


     @Inject 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
      auth 
       .userDetailsService(clientDetailsUserDetailsService()); 
    } 

... 

@Override 
@Bean 
public AuthenticationManager authenticationManagerBean() throws Exception { 
    DaoAuthenticationProvider p = new DaoAuthenticationProvider(); 
    p.setUserDetailsService(userDetailsService); 
    p.setPasswordEncoder(passwordEncoder()); 
    return new ProviderManager(Lists.newArrayList(p)); 
    //  return super.authenticationManagerBean(); 
    } 

    } 

Теперь то, что я достиг должны иметь базовую аутентификацию работает нормально, НО я потерять authorization_ поток кода, поскольку базовая аутентификация теперь выполняется против клиента и секретности, а НЕ фактические учетные данные пользователя

Я что-то упустил? Как я могу использовать оба потока? Пожалуйста, помогите, я боюсь уже несколько дней.

Некоторые подобные вопросы, но без удачи:

ответ

0

Я думаю, что это происходит потому, что вы включили проверку подлинности форм для клиентов, вы это используете, что вместо основного заголовка.

public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { 
    security 
     .allowFormAuthenticationForClients() 
     .checkTokenAccess("authenticated()"); 
} 

Извлечь .allowFormAuthenticationForClients().

 Смежные вопросы

  • Нет связанных вопросов^_^