Spring 3.2 : Filtering Jackson JSON output based on Spring Security role

标签 spring spring-security jackson

有没有什么好方法可以根据 Spring Security 角色过滤 JSON 输出?我正在寻找类似@JsonIgnore的东西,但是对于角色,比如@HasRole(“ROLE_ADMIN”)。我应该如何实现这个?

最佳答案

对于那些从 Google 登陆这里的人,这里有一个使用 Spring Boot 1.4 的类似解决方案。

为每个角色定义接口(interface),例如

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);
    }
}

关于 Spring 3.2 : Filtering Jackson JSON output based on Spring Security role,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17276081/

相关文章:

spring - 如何获取存储在默认模式表中的租户标识符?

java - 如何在 Java Spring 应用程序成功启动时添加日志?

java - Spring 调度程序 url 模式不起作用

spring - 获取 Spring Security 中所有已登录的用户

java - 如何配置Spring安全性

java - Jackson java对象到json序列化不包括空字段

java - @RequestParam 和@PathVariable 封装

spring-security-kerberos 无法读取 key 表?

java - 您可以在 POJO 类中同时使用 @XmlElement 和 @JsonProperty

json - 使用 Jackson 将多个 JsonNode 合并到一个数组中