Java 在响应中隐藏敏感信息

Java 在响应中隐藏敏感信息,java,spring,rest,spring-mvc,spring-boot,Java,Spring,Rest,Spring Mvc,Spring Boot,我目前正在一个项目中工作,我有一个用户模型,并使用RESTAPI获取用户列表。(我有更多的实体) 用户有一个密码字段。我不想在结果中包含密码字段。所以我在DTO中排除了它。但是当我想创建一个用户时,我想在请求中包含密码。因此SpringMVC获取用户实体(而不是DTO) 我认为这样做不好。。。。例如,我有一个事件模型,它通过多对多关系连接到用户。我不希望在请求中出现这种情况。我只想要用户。那你建议我怎么做?有另一种DTO吗 提前感谢。在发送响应时将字段“password”设置为null,Jack

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

用户有一个密码字段。我不想在结果中包含密码字段。所以我在DTO中排除了它。但是当我想创建一个用户时,我想在请求中包含密码。因此SpringMVC获取用户实体(而不是DTO)

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


提前感谢。

在发送响应时将字段“password”设置为null,Jackson不会在响应中显示该字段,请不要将其从模型类中完全删除。

如果使用Jackson序列化响应对象,您可以使用@JsonIgnore注释有问题的属性,它将不会包含在响应中

public User {
    private String email;

    @JsonIgnore
    private String password

    ...getters and setters

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

@JsonIgnore
访问一起使用。只为getter方法编写

范例

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

要避免使用@JsonIgnore,可以使用。 例如,在控制器中,您可以执行以下操作:

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

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视图库导入的。

我尝试了这个
JsonProperty.Access.WRITE\u
,它正在与我一起工作

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)

不清楚你在问什么-你不想让别人看到什么,然后我想把它从回答中排除。我计划对其进行加密(我只是刚开始),但我不认为在响应中包含敏感信息是个好主意。您的响应是JSON吗?如果我
@JsonIgnore
整个属性,它将不会被序列化。即使是二传手。也许只注释getter?您可以只注释getter,或者通过设置JsonProperty的access属性来遵循Zico的答案。但是看看我最新的答案。考虑使用单独的请求和响应对象可能是更好的做法