gpt4 book ai didi

spring - 根据用户角色反序列化 JSON 字段

转载 作者:行者123 更新时间:2023-12-01 13:44:55 24 4
gpt4 key购买 nike

我在模型中有一些字段,我只想在登录用户具有角色 ROLE_ADMIN 时返回这些字段。我可以使用 @JsonIgnore 但这对每个人都隐藏了它。如何让它动态隐藏?

最佳答案

你应该使用 Jackson Json Views实现它的技术——它允许选择一组不同的字段以编程方式序列化。 Spring 也支持它

假设你有一个类 Model,它有两个属性:commonField 应该对每个人可用,secretField 应该只对某些人可用用户。您应该创建一个 View 层次结构(任何类都可以)并使用 @JsonView 注释指定哪个字段在哪个 View 中可用

package com.stackoverflow.jsonview;

import com.fasterxml.jackson.annotation.JsonView;

public class Model {

public static class Public {}
public static class Secret extends Public {}

@JsonView(Public.class)
private String commonField;

@JsonView(Secret.class)
private String secretField;

public Model() {
}

public Model(String commonField, String secretField) {
this.commonField = commonField;
this.secretField = secretField;
}

public String getCommonField() {
return commonField;
}

public void setCommonField(String commonField) {
this.commonField = commonField;
}

public String getSecretField() {
return secretField;
}

public void setSecretField(String secretField) {
this.secretField = secretField;
}

}

现在您可以在具体的 ObjectMapper 中指定要使用的 View

package com.stackoverflow.jsonview;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;

import static org.junit.Assert.*;

/**
*/
public class ModelTest {

@Test
public void testSecretField() throws JsonProcessingException {
Model model = new Model("commonField","secretField");
assertEquals("{\"commonField\":\"commonField\",\"secretField\":\"secretField\"}", new ObjectMapper().writerWithView(Model.Secret.class).writeValueAsString(model));
assertEquals("{\"commonField\":\"commonField\"}", new ObjectMapper().writerWithView(Model.Public.class).writeValueAsString(model));
}

}

我不确定您是否可以使用声明方法让 spring 根据开箱即用的用户角色选择正确的 View ,因此您可能必须编写如下代码:

@RequestMapping("/data")
public String getData(HttpServletRequest request) {
Model model = service.getModel();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper = request.isUserInRole("ROLE_ADMIN") ? objectMapper.writerWithView(Model.Secret.class) : objectMapper.writerWithView(Model.Public.class);
return objectMapper.writeValueAsString(model);
}

关于spring - 根据用户角色反序列化 JSON 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36675590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com