Spring MVC 响应时隐藏敏感信息

kyvafyod  于 2022-11-14  发布在  Spring
关注(0)|答案(5)|浏览(174)

我目前正在一个项目中工作,其中我有一个用户模型,并使用REST API来获取用户列表。(我有更多的实体。)
用户有一个密码字段。我不想在结果中包含密码字段。所以我在DTO中排除了它。但是当我想创建一个用户时,我想在请求中包含密码。所以Spring MVC得到了用户实体(而不是DTO)。
我认为这样做不太好....例如,我有一个Event模型,它与用户之间是多对多的关系。我不希望在请求中有这种关系。我只希望 * 只有 * 用户。那么你建议我怎么做?有另一种DTO吗?

vyswwuz2

vyswwuz21#

@JsonIgnoreAccess.WRITE_ONLY仅用于getter方法。
范例

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

cotxawn72#

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

public User {
    private String email;

    @JsonIgnore
    private String password

    ...getters and setters

}

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

but5z9lq

but5z9lq3#

要避免使用 @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库导入的。

bqf10yzr

bqf10yzr4#

我试过这个JsonProperty.Access.WRITE_ONLY,它对我很有效。

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
hzbexzde

hzbexzde5#

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

相关问题