2015-10-19 2 views
0

Я пытаюсь использовать весеннюю безопасность и весну oauth2 в своем проекте и отделил свой сервер авторизации и сервер ресурсов. Я не хотел делиться хранилищем токенов между этими двумя серверами, поэтому решил использовать RemoteTokenServices и конечную точку check_token. Все было хорошо, за исключением случаев, когда я использовал токен доступа для запроса сервера ресурсов, я получил ошибку «401 Unauthorized» следующим образом:Отключить сервер авторизации и сервер ресурсов с помощью RemoteTokenServices

2015-10-19 11: 50: 10.291 DEBUG 2590 --- [nio-8080- exec-1] osweb.client.RestTemplate: запрос POST для «http://localhost:9080/uaa/oauth/check_token/» привел к 401 (несанкционированный); вызывающий обработчик ошибок 2015-10-19 11: 50: 10.293 DEBUG 2590 --- [nio-8080-exec-1] sswcSecurityContextPersistenceFilter: SecurityContextHolder теперь очищается, по завершении обработки запроса 2015-10-19 11:50: 10.293 DEBUG 2590 --- [nio-8080-exec-1] osweb.filter.RequestContextFilter: очищенный контекст запроса потока: [email protected] 2015-10-19 11:50: 10.297 ERROR 2590 --- [nio-8080-exec-1] oaccC [. [. [/]. [JerseyServlet]: Servlet.service() для сервлета [jerseyServlet] в контексте пути [] исключение

org .springframework.web.client.HttpClientErrorException: 401 Неавторизованный at org.springframework.web.client.DefaultResponseErrorHandler.handleError (DefaultResponseErrorHandler.java:91)

Код для сервера авторизации:

@Configuration 
@EnableAuthorizationServer 
public class OAuthConfiguration extends AuthorizationServerConfigurerAdapter { 
    @Autowired 
    private AuthenticationManager authenticationManager; 

    @Autowired 
    private DataSource dataSource; 

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

    @Bean 
    protected AuthorizationCodeServices authorizationCodeServices() { 
     return new JdbcAuthorizationCodeServices(dataSource); 
    } 

    @Bean 
    public DefaultAccessTokenConverter defaultAccessTokenConverter() { 
     return new DefaultAccessTokenConverter(); 
    } 

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

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

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
     clients.jdbc(dataSource); 
    } 

} 

и конфигурации безопасности:

@Configuration 
@EnableWebSecurity 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.jdbcAuthentication(); 
//   .withUser("John").roles("ADMIN").password("password") 
//   .and() 
//   .withUser("Mary").roles("BASIC").password("password"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests().antMatchers("/**").authenticated() 
      .and().httpBasic().realmName("OAuth Server"); 
     http.csrf().disable(); 
    } 
} 

Сервер ресурсов устанавливается следующим образом:

@Configuration 
@EnableResourceServer 
public class ResourceConfiguration extends ResourceServerConfigurerAdapter { 
    private static String RESOURCE_ID = "xn-resource-id"; 

    private TokenExtractor tokenExtractor = new BearerTokenExtractor(); 


    @Override 
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception { 
     resources.resourceId(RESOURCE_ID); 
    } 

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

    @Bean 
    public AccessTokenConverter accessTokenConverter() { 
     return new DefaultAccessTokenConverter(); 
    } 

    @Bean 
    public RemoteTokenServices remoteTokenServices(final @Value("${auth.server.url}") String checkTokenUrl, 
      final @Value("${auth.server.client_id}") String clientId, 
      final @Value("${auth.server.client_secret}") String clientSecret) { 
     final RemoteTokenServices remoteTokenServices = new RemoteTokenServices(); 
     remoteTokenServices.setCheckTokenEndpointUrl(checkTokenUrl); 
     remoteTokenServices.setClientId(clientId); 
     remoteTokenServices.setClientSecret(clientSecret); 
     remoteTokenServices.setAccessTokenConverter(accessTokenConverter()); 
     return remoteTokenServices; 
    } 
} 

Я проверил безопасность настройки с завихрением и используемым типом-типом client_credentials.

Помогает ли мне выяснить, в чем проблема с вышеуказанным кодом?

+0

вы получите в нижней части этого? – christopher

ответ

0

похоже, что у вас неправильный адрес. Попробуйте repleace его:

http://localhost:9080/uaa/oauth/check_token 

(Обратите внимание, что URL-адрес не закончился /)

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