마이크로 서비스 시스템을 구축하기 위해 스프링 부트와 스프링 클라우드를 적용하기 만하면됩니다. 그리고 Spring Oauth도 적용합니다. 솔직히 모든 것이 완벽합니다. 봄은 훌륭한 일을합니다. 이 시스템에서 JDBC 데이터 소스를 사용하는 OAuth 서버의 작업을 수행하는 마이크로 서비스 프로젝트가 있고 UserDetails 권한 (1 명의 사용자는 여러 권한 있음)을 기반으로 권한을 사용합니다. 리소스 서버 (저지를 사용하여 나머지 API를 노출)의 작업을 수행하는 몇 가지 마이크로 서비스 프로젝트가 있으며 액세스 보안은 OAuth 무기 토큰의 인증 권한을 기반으로합니다.Spring OAuth - 리소스의 리로드 리소스 ID와 인증 기관
자원 서버 OAuth를 설정 클래스는이
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/restservice/object/list")
.hasAuthority("PERMISSION_VIEW_OBJECT_LIST");
// ...
}
@Override
public void configure(ResourceServerSecurityConfigurer resources)
throws Exception {
resources.resourceId("abc-resource-id")
.tokenStore(new JdbcTokenStore(dataSource()));
}
@Bean
@ConfigurationProperties(prefix = "oauth2.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
}
모두 같은 위대한입니다! 그러나 나는이 문제가 발생할 수 :
나는 새로운 RESOURCEID으로 새로운 microservice 프로젝트를 추가하고, 나는 OAuth 클라이언트의 테이블 OAUTH_CLIENT_DETAILS에서 RESOURCE_IDS에 새 리소스 서비스 수익의 나머지 API에 대한 모든 요청을 RESOURCEID 값을 추가하는 경우 이 오류가 발생했습니다. { "error": "access_denied", "error_description": "유효하지 않은 토큰에 자원 ID (xyz-resource-id)가 없습니다"} 새로운 액세스를 얻으려면 사용자 로그 아웃 및 다시 로그인 토큰. 데이터베이스에서 Access 토큰 및 Refresh token int 테이블 OAUTH_ACCESS_TOKEN 및 OAUTH_REFRESH_TOKEN의 레코드를 삭제하는 경우에만 작동합니다.
런타임시 사용자의 권한이 변경되고 인증 권한이 다시로드되지 않으면 권한이 변경되기 전에 테이블 OAUTH_ACCESS_TOKEN의 액세스 토큰의 AUTHENTICATION 값에 오래된 권한이 여전히 있음을 알 수 있습니다. 이 경우 사용자는 변경된 권한으로 새 액세스 토큰을 얻으려면 로그 아웃하고 다시 로그인해야합니다.
그래서이 두 가지 문제를 해결할 수있는 방법이 있습니까? 저는 Spring Cloud Brixton.SR4와 Spring Boot 1.3.5를 사용하고 있습니다. 릴리스.
감사합니다. 리소스 서버 또는 OAuth 서버에서 DefaultTokenServices를 확장한다는 의미입니까? 내 바보 미안, 어떻게 사용자 지정 TokenServices 클래스를 주입하도록 설정할 수 있습니까? –
인증 서버에서 사용자 세부 정보를로드하는 부분입니다. 구현을 내 대답에 추가했습니다 –
대단히 고맙습니다. 시도해 보겠습니다. –