根据用户权限隐藏/重新映射Hibernate实体中的字段值



在Spring 2.6/JPA 1/Hibernate 3.3应用程序中,我需要根据当前用户的权限"隐藏"一些实体字段数据。

。在实体"Document"上有一个字段"title",它映射到DOC表中的标题列。根据用户的权限,如果他/她不被允许阅读标题,标题应该是"CONFIDENTIAL",或者它应该只包含从数据库中获取的正确值。这同样适用于许多其他属性。

问题是我不能在UI中应用表示模型或某些过滤。这是因为实体对象将被传递到另一层,该层负责后处理并最终在UI中显示数据,而真实数据(即"title"的真实值)不应该被传递到该层,因为它是公开可访问的。因此,实体对象本身应该是"密封的",而不能通过API访问实际值——但是实体当然可以在内部存储它的状态。

一种简单的方法是获取Document对象列表,然后遍历它,如果不允许用户访问,则将标题设置为"CONFIDENTIAL"。当然,这将改变实体,所以当它被发送回持久化层时,合并标题的值("CONFIDENTIAL")将被写入数据库——当然,这在任何情况下都不应该发生。

所以要么,我必须为这些实体编写自定义插入/更新语句(大量的工作)和/或编写自定义加载器逻辑,交换实体中的数据-但我又不知道如何存储和跟踪实体的原始状态,当它涉及到合并。同样,当使用JPQL/HQL而不是EM方法进行加载时,这将失败。

我的问题是:

  • 我有什么选项来"重新映射"基于当前用户的实体值,而不破坏更新/合并机制?
  • 拦截器(Hibernate或Spring/AOP风格)可以在这里提供帮助吗?但是,还是那句话:如何处理合并?

谢谢,德怀特

我想到的一个选择是写一个spring方面来跨应用程序的适当层(服务层?),它将在实体跨层边界时切换值。在退出时,它会将值从"my secret value"更改为"CONFIDENTIAL",并且它会记住旧值以及它来自哪个实体。然后,如果/当实体被传递回来,它将设置"我的秘密值"回到它的位置。因此,在您的边界一侧,实体将始终具有正确的值,但秘密值永远不会离开边界,因此永远不会被泄露。

最新更新