0

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

看起来完成这项工作的唯一选择是使用 EntityListeners。PostLoad我可以在事件期间使用 EntityListener 并屏蔽某个列。例如,我my_secure_column用 XXX 屏蔽列并显示给用户。

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

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

编辑1:这看起来像是以稍微更好的方式实现这一目标的第一步。在 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);
}
4

1 回答 1

1

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

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

作为替代方案,您可以创建一个视图 bean (POJO),然后使用JPQL Constructor Expression。我个人会使用CriteriaBuilder。构造()而不是连接JPQL查询,但原理相同。

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

于 2017-01-06T14:20:07.637 回答