【发布时间】:2014-12-08 08:43:20
【问题描述】:
在我们的项目中,我们在 Mysql 上使用 spring、JPA 和 hibernate。 我有一个数据库表,其中包含每个用户的权限。这张表对整个系统都有很多影响。 我需要添加一个“超级用户”/管理员,它对所有内容都具有权限。 我希望这个管理员用户所做的每个查询 - 都会像权限表一样“模拟”包含这个管理员用户的权限。
例如: 数据库表是 -
entityId | userId
如果我们有 2 个实体,并且用户#17 对它们具有权限,那么行将是
1 | 17
2 | 17
假设管理员用户是用户#20。我不想在此表中添加行。我希望每次访问该表都会添加“临时行”。 例如,如果我有以下查询:
select e from MyEntity e where e.id in (select p.entityId from PermissionEntity p where p.userId = :userId)
我希望如果登录用户是管理员用户,查询将如下所示:
select e from MyEntity e where e.id in (select p.entityId from PermissionEntity p)
或
select e from MyEntity e where e.id in (select p.entityId from PermissionEntity p where 1=1 or p.userId = :userId)
对如何实现有任何建议?
【问题讨论】:
-
Hibernate 有filters 的概念,您可以使用它来动态地将子句添加到查询中。我们在其中一个项目中成功地做到了这一点。对于普通用户,数据仅限于他们可以看到的内容,对于管理员,我们根本没有添加附加条款。
-
另一种选择是使用 Spring Security 而不是数据库过滤器。您可以使用 Spring Security 将 ACL 应用于您的对象。虽然设置起来很麻烦,并且当您拥有大量结果集时可能会影响性能。
标签: spring hibernate jpa spring-data