隐藏敏感信息作为回应

时间:2017-08-23 08:22:36

标签: java spring rest spring-mvc spring-boot

我目前正在一个项目中工作,我有一个用户模型并使用REST API来获取用户列表。 (我有更多的实体)。

用户有密码字段。我不想在结果中包含密码字段。所以我把它排除在DTO之外。但是当我想创建一个用户时,我想在请求中包含密码。所以Spring MVC获得了User实体(而不是DTO)。

我不认为这样做很好....例如,我有一个事件模型,它连接到具有多对多关系的用户。我在请求中不希望这样。我只想要用户。那么你建议我做什么?有另一种DTO吗?

提前致谢。

5 个答案:

答案 0 :(得分:15)

  

仅将@JsonIgnoreAccess.WRITE_ONLY一起用于getter方法

示例

@JsonProperty(access = Access.WRITE_ONLY)
private String password;

答案 1 :(得分:4)

如果您使用jackson序列化您的响应对象,您可以使用@JsonIgnore注释相关属性,并且它不会包含在响应中。

public User {
    private String email;

    @JsonIgnore
    private String password

    ...getters and setters

}

创建单独的响应对象也可能是一个好主意,这些响应对象仅包含您想要的字段,以防您在路上添加敏感字段并忘记隐藏它们。同样,您也可以使用单独的请求对象来创建包含密码字段的用户。像用户这样的业务实体最好只在内部使用,这样你就可以控制哪些信息被公开。

答案 2 :(得分:4)

为避免使用@JsonIgnore,您可以使用json-view library。 例如,在您的控制器中,您可以执行以下操作:

首先在控制器变量中声明:

private JsonResult json = JsonResult.instance();

然后使用此方法:

@RequestMapping("/get/{id}")
public void getUserById(@PathVariable(value = "id") long id) {
    User user = usersService.findOne(id);
    json.use(JsonView.with(user)
            .onClass(User.class, Match.match()
                    .exclude("password").exclude("yetAnothertopSecretField")));
}

它返回没有排除字段的JSON。

JsonView,JsonResult类从json-view库导入。

答案 3 :(得分:0)

制作字段'密码'发送响应时为null,而杰克逊不会在回复时显示,不要将其从模型类中完全删除。

答案 4 :(得分:0)

我已经尝试过这个JsonProperty.Access.WRITE_ONLY,它正在与我合作。

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
相关问题