【问题标题】:Hiding sensitive information in response隐藏敏感信息作为回应
【发布时间】:2018-01-31 17:30:12
【问题描述】:

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

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

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

提前致谢。

【问题讨论】:

  • 不清楚你在问什么——你不想让别人看到然后加密它
  • 我想从响应中排除它。我打算加密它(我只是在开始),但在回复中包含敏感信息并不是一个好主意。
  • 你的响应是 JSON 吗?

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


【解决方案1】:

@JsonIgnoreAccess.WRITE_ONLY 仅用于 getter 方法

例子

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

【讨论】:

    【解决方案2】:

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

    public User {
        private String email;
    
        @JsonIgnore
        private String password
    
        ...getters and setters
    
    }
    

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

    【讨论】:

    • 如果我@JsonIgnore整个属性,它根本不会被序列化。即使是二传手。也许只注释 getter?
    • 您可以只注释getter,或者通过设置JsonProperty的访问属性来遵循Zico的回答。但请查看我更新的答案。考虑使用单独的请求和响应对象可能是更好的做法。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
      

      【讨论】:

      • 注意 - 这对 Newtonsoft.Json 序列化程序有效
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-24
        • 1970-01-01
        • 2010-11-30
        • 2012-01-01
        • 1970-01-01
        • 2016-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多