1

마이크로 서비스 시스템을 구축하기 위해 스프링 부트와 스프링 클라우드를 적용하기 만하면됩니다. 그리고 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(); 
    } 
} 

모두 같은 위대한입니다! 그러나 나는이 문제가 발생할 수 :

  1. 나는 새로운 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의 레코드를 삭제하는 경우에만 작동합니다.

  2. 런타임시 사용자의 권한이 변경되고 인증 권한이 다시로드되지 않으면 권한이 변경되기 전에 테이블 OAUTH_ACCESS_TOKEN의 액세스 토큰의 AUTHENTICATION 값에 오래된 권한이 여전히 있음을 알 수 있습니다. 이 경우 사용자는 변경된 권한으로 새 액세스 토큰을 얻으려면 로그 아웃하고 다시 로그인해야합니다.

그래서이 두 가지 문제를 해결할 수있는 방법이 있습니까? 저는 Spring Cloud Brixton.SR4와 Spring Boot 1.3.5를 사용하고 있습니다. 릴리스.

답변

1

기본 Spring JdbcTokenStore를 사용하는 경우 사용자가 토큰을 처음으로 인증하고 검색 할 때 사용자 인증이 일련 화되고 액세스/새로 고침 토큰과 함께 저장됩니다.

토큰을 사용하여 인증 할 때마다로드 된이 저장 인증은 사용자 권한 변경 또는 추가 리소스 추가가 사용자 권한에 반영되지 않는 이유입니다.

일부 사항을 점검하기 위해 DefaultTokenServices를 확장하고 loadAuthentication (String accessTokenValue) 메소드를 재정 의하여 사용자 인증이 토큰 저장소에서로드되면 사용자 고유의 검사를 수행 할 수 있습니다.

이렇게하는 것이 이상적인 방법 일 수는 없지만 지금까지 그렇게 해왔다는 것이 유일한 방법입니다. DefaultTokenServices을 무시

, 당신에 AuthorizationServerConfigurerAdapter 설정 클래스를 때라도 빈 메소드를 추가

class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { 
    @Bean 
    public AuthorizationServerTokenServices authorizationServerTokenServices() throws Exception { 
     // Where YourTokenServices extends DefaultTokenServices 
     YourTokenServices tokenServices = new YourTokenServices(); 
     tokenServices.setTokenStore(tokenStore); 
     tokenServices.setClientDetailsService(clientDetailsService); 
     return tokenServices; 
    } 
} 
+0

감사합니다. 리소스 서버 또는 OAuth 서버에서 DefaultTokenServices를 확장한다는 의미입니까? 내 바보 미안, 어떻게 사용자 지정 TokenServices 클래스를 주입하도록 설정할 수 있습니까? –

+0

인증 서버에서 사용자 세부 정보를로드하는 부분입니다. 구현을 내 대답에 추가했습니다 –

+0

대단히 고맙습니다. 시도해 보겠습니다. –

0

나는 이런 식으로 다시로드 문제를 해결.

@Bean 
public ClientDetailsService jdbcClientDetailsService() { 
    return new JdbcClientDetailsService(dataSource); 
}