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

时间:2014-09-22 02:27:59

标签: jsf java-ee ejb jaas glassfish-4

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

  • JS​​F
  • JPA
  • GlassFish 4
  • Derby 10.10.1.1

首先,我创建了以下对象:

  • 人(JPA实体)
    • 名称
    • 地址
    • 电子邮件
  • PersonManager(无状态EJB)
    • createPerson
    • deletePerson的
    • 的updatePerson
    • findPersonById

然后我用支持bean创建了以下xhtml页面。

  • PersonCreater
  • PersonViewer
  • PersonUpdater

使用JSF和JPA,我发现使用支持bean创建xhtml很容易,以支持创建,查看和更新​​我的person对象。

使用Java EE Security @RolesAllowed注释,很容易将对PersonManager方法的访问限制为特定角色,并且使用web.xml security-constraint元素很容易将JSF页面访问限制为特定角色。

我现在要将社交安全号码等敏感信息添加到我的Person实体,但我只希望特定角色能够创建,读取和更新敏感信息。是否有标准方法将敏感信息添加到实体然后控制访问?

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

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

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

}

如果我将社会安全号码属性添加到Person实体,该方法将返回带有返回Person的社会安全号码给具有角色Reader的所有用户。当然,我希望每个人都能够阅读与我的Person对象相关的大部分数据,但我不希望每个人都能阅读Person的社会安全号码。

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

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

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

0 个答案:

没有答案