2014-10-27 100 views
0

我正在使用杰克逊序列化对象以保存在MongoDB上(通过Jongo)。这些对象包含我想要存储在数据库上的密码哈希。安全 - 杰克逊密码序列化

我也有一个REST API将返回这些对象。当对象通过REST API序列化时,它们将包含密码哈希。尽管通信是通过HTTPS完成的,但这对我来说听起来像是一种安全风险。我如何通过REST API阻止密码散列的序列化,但是不能防止数据库持久化?有没有像字段的条件序列化?

回答

2

@JsonView可能适合您的需要。

// View definitions: 
    class Views { 
      static class Public { } 
      static class Internal extends Public { } 
    } 

    public class User { 
      // Name is public 
      @JsonView(Views.Public.class) String name; 
      // Hash password only for internal usage 
      @JsonView(Views.Internal.class) String hashPassword; 
    } 

在你的REST API,你可以指定:

public class Resource { 

    @JsonView(Views.Public.class) 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public List<User> getElements() { 
    //do something 
    return someResultList; 
    } 
} 

以上API只在响应用户的 “名” 属性。

注意:如果没有view标注,则认为是由Object.class标识的View:即包含在所有视图中。

当序列化到数据库,你可以这样做:

objectMapper.viewWriter(Views.Internal.class).writeValue(out, beanInstance); 

其中包括用户的所有属性。

更多的信息在这里:http://wiki.fasterxml.com/JacksonJsonViews

+0

这确实是一种可能性。我不知道该视图功能。但是,由于我使用的是Play框架,我不确定是否可以使用这种注释'@ JsonView' – hvieira 2014-10-30 22:31:44