Jsf 如何基于当前角色限制对JPA实体特定属性的访问?

Jsf 如何基于当前角色限制对JPA实体特定属性的访问?,jsf,jakarta-ee,ejb,jaas,glassfish-4,Jsf,Jakarta Ee,Ejb,Jaas,Glassfish 4,我正在使用以下技术开发Java EE业务管理应用程序: JSF JPA 玻璃鱼4 德比10.10.1.1 首先,我创建了以下对象: 个人(JPA实体) 名字 地址 电子邮件 等等 PersonManager(无状态EJB) 创造者 害人 更新人员 findPersonById 然后,我用支持bean创建了以下xhtml页面 造人机 PersonViewer 人事顾问 使用JSF和JPA,我发现很容易创建带有支持bean的xhtml,以支持创建、查看和更新我的person对象

我正在使用以下技术开发Java EE业务管理应用程序:

  • JSF
  • JPA
  • 玻璃鱼4
  • 德比10.10.1.1
首先,我创建了以下对象:

  • 个人(JPA实体)
    • 名字
    • 地址
    • 电子邮件
    • 等等
  • PersonManager(无状态EJB)
    • 创造者
    • 害人
    • 更新人员
    • findPersonById
然后,我用支持bean创建了以下xhtml页面

  • 造人机
  • PersonViewer
  • 人事顾问
使用JSF和JPA,我发现很容易创建带有支持bean的xhtml,以支持创建、查看和更新我的person对象

使用javaee Security@RolesAllowed注释,可以很容易地将PersonManager方法的访问限制为特定角色,使用web.xml安全约束元素可以很容易地将JSF页面访问限制为特定角色

我现在想要将敏感信息(如社会保险号)添加到我的个人实体中,但我只希望特定角色能够创建、读取和更新敏感信息。是否有向实体添加敏感信息然后控制访问的标准方法

我的基本问题是PersonManager的getPersonById方法。当前,此方法如下所示:

@RolesAllowed("Reader")
public Person findPersonById(long id) {

    return em.find(Person.class, id);

}
如果我将social security number属性添加到Person实体中,该方法将向具有角色读取器的所有用户返回带有返回的Person的social security number。当然,我希望每个人都能读取与我的Person对象关联的大部分数据,但我不希望每个人都能读取此人的社会保险号

我可以使用EJBContext的getCallerPrincipal和isCallerInRole方法向gerPersonById方法添加逻辑,以基于当前角色从Person对象中删除敏感信息。这是限制使用社会保障财产的好办法吗

我想把所有的敏感信息放在另一个叫做PersonSensitive的实体中,然后在PersonSensitive和PersonSensitive之间建立一种一对一的关系。但是,这又让我回到了如何根据当前角色限制对特定实体字段的访问的问题。我尝试在Person实体上使用@RolesAllowed,但这不起作用


我可能能够使用某种类型的继承方案,其中敏感数据属于Person的后代,并且只有特定角色才能访问后代的manager方法。然而,这导致我创建了JSF页面集,其中每个页面集都指定由特定角色使用。也许这是向前迈进的最佳方式,但它似乎需要很多额外的工作。

只需通过
OneToOne
(紧密耦合)连接
个人
个人敏感
,而只需按需加载
个人敏感
(通过
@RolesAllowed
应用程序服务)。由于较少的耦合和细粒度的、定义良好的访问控制提高了安全性,这涉及到的额外工作将在以后得到回报。我一直在考虑我的人JPA实体作为我的顶层数据对象,但我可以考虑我的人称名词,包括多个JPA实体,如人和个性敏感。我的PersonManager EJB将控制两个实体上的CRUD事务。我可以主要使用声明性授权,而只使用一点编程授权。在接下来的几天里,我将试验这种技术。谢谢你的指导!