스프링의 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");
}
}