JHipster基于角色的某些列的屏蔽

时间:2017-01-06 12:34:07

标签: jpa spring-data jhipster role-based-access-control

在基于JHipster的项目中,我们需要根据登录的角色/用户有选择地过滤掉某些列。所有用户都可以查看/修改大多数列,但只有一些特权用户才能查看/修改某些安全字段/列。

看起来完成此操作的唯一选择是使用EntityListeners。我可以使用EntityListener并在PostLoad事件期间屏蔽某个列。比方说,我用XXX掩盖列my_secure_column并显示给用户。

用户然后更改其他一些字段/列(他有权访问)并提交表单。我是否必须再次在PreUpdate事件中捕获部分填充的实体,从数据库中获取my_secure_column的原始值并在保持之前设置它?

这一切似乎效率低下。搜索了几个小时,但找不到最适合此用例的具体实现。

编辑1:这看起来是以更好的方式实现此目标的第一步。 Updating Entities with Update Query in Spring Data JPA

我可以使用特定的部分更新,例如updateAsUserRole,updateAsManagerRole等,而不是一直持久保存整个实体。

@Repository
public interface CompanyRepository extends JpaRepository<Company, Integer> {
   @Modifying(clearAutomatically = true)
   @Query("UPDATE Company c SET c.address = :address WHERE c.id = :companyId")
   int updateAddress(@Param("companyId") int companyId, @Param("address") String address);
}

1 个答案:

答案 0 :(得分:1)

基于列的安全性不是一个容易解决的问题,尤其是与JPA结合使用时。

理想情况下,您希望避免加载列,但由于您选择的是实体,因此默认情况下这是不可能的,因此您必须通过在加载后覆盖该值来删除受限制的内容。

作为替代方法,您可以创建视图bean(POJO),然后使用JPQL Constructor Expression。就个人而言,我会使用CriteriaBuilder. construct()而不是连接JPQL查询,但原则相同。

关于更新数据,UI应该导致不允许编辑受限字段。但是,您仍需要在后端进行验证,我建议您在调用JPA之前检查列是否已修改。通常,您在DTO中进行了修改,并且无论如何都需要加载实体,如果修改了受限制的列,您将发回错误。这样,您只需在检查安全性后调用JPA。