有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用@RolesAllowed通过RESTEasy和Jackson过滤实体属性

使用RESTEasy和Jackson,是否可以在我的模型中使用@RolesAllowed注释,以避免在输出中序列化某些属性,具体取决于用户的角色

我已经找到了大量关于如何使用Jersey实现这一点的文档,但是没有找到RESTEasy

我在这个架构上被阻止了,所以切换库不是一个选项,并且使用自定义ObjectMapper(如所解释的here)也不是一个选项,因为模型太大了,需要花费大量时间来标记大数据集的每个属性以进行正确的序列化。另外,这是指一个旧版本的杰克逊图书馆,我不知道如何使它与新版本的工作

编辑

具体参见this blog post了解我试图实现的目标。请注意,这是特定于Jersey的,到目前为止,我还没有找到关于RESTEasy的文档来实现这一点


共 (1) 个答案

  1. # 1 楼答案

    如果您不愿意使用^{},则可以考虑^{}。首先需要扩展^{}并根据用户角色控制序列化:

    public class RoleBasedPropertyFilter extends SimpleBeanPropertyFilter {
    
        private String allowedRole;
    
        public RoleBasedPropertyFilter(String allowedRole) {
            this.allowedRole = allowedRole;
        }
    
        @Override
        public void serializeAsField(Object pojo, JsonGenerator jgen,
                                     SerializerProvider provider, 
                                     PropertyWriter writer) throws Exception {
    
            PermitAll permitAll = writer.getAnnotation(PermitAll.class);
            if (permitAll != null) {
                serializeAsField(pojo, jgen, provider, writer);
                return;
            }
    
            DenyAll denyAll = writer.getAnnotation(DenyAll.class);
            if (denyAll != null) {
                writer.serializeAsOmittedField(pojo, jgen, provider);
                return;
            }
    
            RolesAllowed rolesAllowed = writer.getAnnotation(RolesAllowed.class);
            if (rolesAllowed != null) {
                if (!Arrays.asList(rolesAllowed.value()).contains(allowedRole)) {
                    writer.serializeAsOmittedField(pojo, jgen, provider);
                    return;
                }
            }
    
            // If no annotation is provided, the property will be serialized
            writer.serializeAsField(pojo, jgen, provider);
        }
    }
    

    要将筛选器应用于某个bean,请使用@JsonFilter("roleBasedPropertyFilter")对其进行注释:

    @JsonFilter("roleBasedPropertyFilter")
    public class User {
    
        private String firstName;
        private String lastName;
        private String email;
        private String password;
    
        public String getFirstName() {
            return firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        @RolesAllowed({"ADMIN"})
        public String getEmail() {
            return email;
        }
    
        @DenyAll
        public String getPassword() {
            return password;
        }
    
        // Other getters and setters
    }
    

    然后在^{}中为^{}注册筛选器:

    String currentUserRole = // Get role from the current user
    
    FilterProvider filterProvider = new SimpleFilterProvider()
            .addFilter("roleBasedPropertyFilter", 
                    new RoleBasedPropertyFilter(currentUserRole));
    
    ObjectMapper mapper = new ObjectMapper();
    mapper.setFilterProvider(filterProvider);
    

    如果您想使过滤器成为“全局的”,也就是说,应用于所有bean,您可以在类中创建一个mix,并用@JsonFilter("roleBasedPropertyFilter")注释它:

    @JsonFilter("roleBasedPropertyFilter")
    public class RoleBasedPropertyFilterMixIn {
    
    }
    

    然后将类中的mix绑定到Object

    mapper.addMixIn(Object.class, RoleBasedPropertyFilterMixIn.class);