2015-07-23 1 views
0

У меня есть два конечных пункта.Spring Security OAuth - как включить токен доступа или доступа к другим ресурсам?

/foo - внутренняя (полу-частная) конечная точка. Он разрешен только для настроенных клиентов. (Нет идентификатора пользователя и учетных данных, но идентификатор клиента достаточен)

/greetings - это частная конечная точка. Он разрешен только для клиентов и пользователей. (оба идентификатора клиента, имя пользователя и пароль)

Вот конфигурация.

@Configuration 
public class OAuth2ServerConfiguration { 

    private static final String RESOURCE_ID = "restservice"; 

    @Configuration 
    @EnableResourceServer 
    protected static class ResourceServerConfiguration extends 
      ResourceServerConfigurerAdapter { 

     @Override 
     public void configure(ResourceServerSecurityConfigurer resources) { 
      // @formatter:off 
      resources 
       .resourceId(RESOURCE_ID); 
      // @formatter:on 
     } 

     @Override 
     public void configure(HttpSecurity http) throws Exception { 
      // @formatter:off 
      http 
       .authorizeRequests() 
        .antMatchers("/users").hasRole("ADMIN") 
        .antMatchers("/greeting").authenticated() 
        .antMatchers("/foo").authenticated(); 
      // @formatter:on 
     } 

    } 

    @Configuration 
    @EnableAuthorizationServer 
    protected static class AuthorizationServerConfiguration extends 
      AuthorizationServerConfigurerAdapter { 

     private TokenStore tokenStore = new InMemoryTokenStore(); 

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

     @Autowired 
     private CustomUserDetailsService userDetailsService; 

     @Override 
     public void configure(AuthorizationServerEndpointsConfigurer endpoints) 
       throws Exception { 
      // @formatter:off 
      endpoints 
       .tokenStore(this.tokenStore) 
       .authenticationManager(this.authenticationManager) 
       .userDetailsService(userDetailsService); 
      // @formatter:on 
     } 

     @Override 
     public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
      // @formatter:off 
      clients 
       .inMemory() 
        .withClient("clientapp") 
         .authorizedGrantTypes("password", "refresh_token","authorization_code") 
         .authorities("USER","ROLE_CLIENT") 
         .scopes("read", "write") 
         .resourceIds(RESOURCE_ID) 
         .secret("123456") 
         .accessTokenValiditySeconds(600); 
      // @formatter:on 
     } 

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

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

    } 

} 

Вот контроллер

@RestController 
public class GreetingController { 

    private static final String template = "Hello, %s! your password is %s"; 

    private final AtomicLong counter = new AtomicLong(); 

    @RequestMapping("/greeting") 
    public Greeting greeting(@AuthenticationPrincipal User user) { 
     return new Greeting(counter.incrementAndGet(), String.format(template, user.getName(),user.getPassword())); 
    } 

    @RequestMapping("/foo") 
    public String foo(@AuthenticationPrincipal User user) { 
     System.out.println(user==null); 
     return "you are permitted here"; 
    } 

} 

Я не в состоянии получить доступ к http://localhost:9001/foo без маркеров. поэтому, когда я пытаюсь получить доступ токенов с помощью завиток ниже (обратите внимание, я не передать имя пользователя и пароль, только client_id и передается client_secret)

с url -X POST -vu clientapp:123456 http://localhost:9001/oauth/token -H "Accept: application/json" -d "grant_type=password&scope=read%20write&client_secret=123456&client_id=clientapp"

Я получаю эту ошибку

{"error":"invalid_grant","error_description":"Bad credentials"} 

что-то не так с моей конфигурацией. Я начинаю использовать Spring Security OAuth. был бы признателен за любую помощь здесь.

благодаря

+0

Вы просмотрели fue line .antMatchers ("/ foo"). authenticated(); кажется, что конфигурация тура запрашивает аутентификацию flor/foo –

+0

Как я уже говорил, я хочу/'foo' быть доступным только клиенту. Не публично. Но клиент может получить доступ, не указывая имя пользователя и пароль. Как я могу это достичь? –

ответ

0

Я думаю, что вы передаете неправильно grant_type ...

curl -X POST -vu clientapp:123456 http://localhost:9001/oauth/token -H "Accept: application/json" -d "grant_type=client_credentials&scope=read%20write&client_secret=123456&client_id=clientapp" 

Кроме того, насколько я помню, вы не должны дублировать client_id и client_secret в заголовке и теле запроса .. только заголовка должно быть достаточно

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

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