Я пытаюсь использовать весеннюю безопасность и весну 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.
Помогает ли мне выяснить, в чем проблема с вышеуказанным кодом?
вы получите в нижней части этого? – christopher