복붙노트

[SPRING] Spring 3.2 : Spring 보안 역할에 기반한 Jackson JSON 출력 필터링

SPRING

Spring 3.2 : Spring 보안 역할에 기반한 Jackson JSON 출력 필터링

스프링 보안 역할을 기반으로 JSON 출력을 필터링하는 좋은 방법이 있습니까? @JsonIgnore와 같은 것을 찾고 있지만 역할에 대해서는 @HasRole ( "ROLE_ADMIN")과 같습니다. 어떻게 구현해야합니까?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    3.맞춤 JSON 처리 필터 (예 : JSON 포인터 기반)를 작성할 수도 있지만 다소 복잡 할 것입니다.

    맞춤 JSON 처리 필터 (예 : JSON 포인터 기반)를 작성할 수도 있지만 다소 복잡 할 것입니다.

    가장 간단한 방법은 사용자 고유의 DTO를 만들고 사용자가 가져올 권한이있는 속성 만 매핑하는 것입니다.

  4. 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