2016-08-08 3 views
1

스프링의 oauth2 범위를 기반으로 리소스 필드 수준 필터링을 구현하기위한 주석 또는 DI 기반 접근법이 있습니까?스프링 부트 - OAuth2 - 필드 수준의 범위 제한 리소스

우리는 oauth2 범위 보호 엔드 포인트를 가진 스프링 부트 기반 리소스 서버를 보유하고 있습니다. 이것은 엔드 포인트를 보호하는 범위에서 잘 작동하지만 범위를 기반으로 노출하는 리소스에서 중요한 정보를 필터링 할 수 있기를 원합니다. 예 : 클라이언트 범위가 허용하는 경우에만 사람의 SSN 중 마지막 4 개를 노출하고 싶습니다.

범위는 자원이 존재하지 않는 "xyz.read는"과 같이 표시됩니다 그래서
Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
OAuth2SecurityExpressionMethods expressionMethods = new OAuth2SecurityExpressionMethods(authentication); 

boolean hasScope = expressionMethods.hasScope("xyz.read"); 

if(hasScope) { 
    resource.setSsn(entity.getSsn()); 
} 

:

지금까지 내가 리소스 서버에이 작업을 수행하기 위해 찾은 유일한 방법은 다음과 같이이다

{ 
    "name": "blah" 
} 

그러나 범위 "xyz.read이"있을 때 리소스는 다음과 같이 표시됩니다

{ 
    "name": "blah", 
    "ssn": "123-45-2347" 
} 

갖는 보안 컨텍스트 홀더에서 인증 객체를 가져 와서 범위를 확인하고 싶을 때마다 새로운 OAuth2SecurityExpressionMethods를 생성하여 우리가 무언가를 놓친 것처럼 보입니다. 그러나 이것이 '순수한'OAuth2 리소스 서버이기 때문에이를 수행하는 더 좋은 방법을 발견하지 못했습니다.

이 우리의 리소스 서버 구성의 모습 (그것이 잘 작동 않음) 무엇을 : 당신은 뷰 이름이 인증 또는 액세스 수준을 반영 @JsonView 주석의 사용을 만들 수

@Configuration 
@EnableResourceServer 
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests() 
      .antMatchers("/health").permitAll() 
      .antMatchers("/info").permitAll() 
      .antMatchers("/").permitAll() 
      .antMatchers("/**").access("#oauth2.hasScope('xyz.read')"); 
    } 

    @Override 
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception { 
     resources.resourceId("resource-id"); 
    } 
} 

답변