[SPRING] Spring 3.2 : Spring 보안 역할에 기반한 Jackson JSON 출력 필터링
SPRINGSpring 3.2 : Spring 보안 역할에 기반한 Jackson JSON 출력 필터링
스프링 보안 역할을 기반으로 JSON 출력을 필터링하는 좋은 방법이 있습니까? @JsonIgnore와 같은 것을 찾고 있지만 역할에 대해서는 @HasRole ( "ROLE_ADMIN")과 같습니다. 어떻게 구현해야합니까?
해결법
-
==============================
1.Google의 방문객을 위해 Spring Boot 1.4와 비슷한 해결책이 있습니다.
Google의 방문객을 위해 Spring Boot 1.4와 비슷한 해결책이 있습니다.
각 역할에 대한 인터페이스를 정의하십시오 (예 :
public class View { public interface Anonymous {} public interface Guest extends Anonymous {} public interface Organizer extends Guest {} public interface BusinessAdmin extends Organizer {} public interface TechnicalAdmin extends BusinessAdmin {} }
엔티티에서 @JsonView를 선언하십시오 (예 :
@Entity public class SomeEntity { @JsonView(View.Anonymous.class) String anonymousField; @JsonView(View.BusinessAdmin.class) String adminField; }
@ControllerAdvice를 정의하여 역할을 기반으로 올바른 JsonView를 선택하십시오.
@ControllerAdvice public class JsonViewConfiguration extends AbstractMappingJacksonResponseBodyAdvice { @Override public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { return super.supports(returnType, converterType); } @Override protected void beforeBodyWriteInternal(MappingJacksonValue bodyContainer, MediaType contentType, MethodParameter returnType, ServerHttpRequest request, ServerHttpResponse response) { Class<?> viewClass = View.Anonymous.class; if (SecurityContextHolder.getContext().getAuthentication() != null && SecurityContextHolder.getContext().getAuthentication().getAuthorities() != null) { Collection<? extends GrantedAuthority> authorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities(); if (authorities.stream().anyMatch(o -> o.getAuthority().equals(Role.GUEST.getValue()))) { viewClass = View.Guest.class; } if (authorities.stream().anyMatch(o -> o.getAuthority().equals(Role.ORGANIZER.getValue()))) { viewClass = View.Organizer.class; } if (authorities.stream().anyMatch(o -> o.getAuthority().equals(Role.BUSINESS_ADMIN.getValue()))) { viewClass = View.BusinessAdmin.class; } if (authorities.stream().anyMatch(o -> o.getAuthority().equals(Role.TECHNICAL_ADMIN.getValue()))) { viewClass = View.TechnicalAdmin.class; } } bodyContainer.setSerializationView(viewClass); } }
-
==============================
2.rkonovalov / jfilter의 사용을 고려해야합니다. 특별히 @DynamicFilterComponent는 많은 도움이됩니다. 이 DZone 기사에서 좋은 가이드를 볼 수 있습니다.
rkonovalov / jfilter의 사용을 고려해야합니다. 특별히 @DynamicFilterComponent는 많은 도움이됩니다. 이 DZone 기사에서 좋은 가이드를 볼 수 있습니다.
여기서는 @DynamicFilterComponent에 대해 설명합니다.
위에서 언급 한 요구 사항을 구현했습니다. 내 시스템은 Restful Jersey 1.17, Spring Security 3.0.7, Jackson 1.9.2를 사용합니다. 그러나이 솔루션은 Jersey Restful API와는 아무런 관련이 없으며 다른 종류의 서블릿 구현에도 사용할 수 있습니다.
이것은 내 솔루션의 전체 5 단계입니다.
지금부터는 원하는 모든 속성 뒤에 @JsonSpringView 주석 만 언급하면됩니다. 이렇게 :
public class PersonDataTransferObject { private String name; @JsonSpringView(springRoles="ADMIN, SUPERUSER") // Only Admins And Super Users Will See the person National Code in the automatically produced Json. private String nationalCode; }
-
==============================
3.맞춤 JSON 처리 필터 (예 : JSON 포인터 기반)를 작성할 수도 있지만 다소 복잡 할 것입니다.
맞춤 JSON 처리 필터 (예 : JSON 포인터 기반)를 작성할 수도 있지만 다소 복잡 할 것입니다.
가장 간단한 방법은 사용자 고유의 DTO를 만들고 사용자가 가져올 권한이있는 속성 만 매핑하는 것입니다.
from https://stackoverflow.com/questions/17276081/spring-3-2-filtering-jackson-json-output-based-on-spring-security-role by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring에서 ApplicationContext를 정확히 닫는 방법은 무엇입니까? (0) | 2019.01.16 |
---|---|
[SPRING] Hibernate (JDBC 아님)를 통해 blob에서 이미지 검색 (0) | 2019.01.16 |
[SPRING] GWT Dev 모드 + Spring 3.1 + Hibernate 4.0.1의 예외 (0) | 2019.01.16 |
[SPRING] 스프링 웹 클라이언트를 멀티 스레드 환경에서 사용하는 올바른 방법 (0) | 2019.01.16 |
[SPRING] @Autowired와 함께 @Transaction 주석 사용 - 봄 (0) | 2019.01.16 |