【问题标题】:Changing DB query for specific user更改特定用户的数据库查询
【发布时间】: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


【解决方案1】:

我想您有一个检查权限的中心方法。如果是这样,只需尝试:

TypedQuery<MyEntity> query = null;
if (crtUser.getId() != 20) {
    query = entityManager.createQuery("select e from MyEntity e where e.id in (select p.entityId from PermissionEntity p p.userId = :userId)", MyEntitiy.class);
}
else {
    query = entityManager.createQuery("select e from MyEntity e", MyEntitiy.class);
}

如果您没有此逻辑的中心方法,但只有一个方法,那么您可以尝试以下方法:

    query = entityManager.createQuery("select e from MyEntity e where e.id in (select p.entityId from PermissionEntity p p.userId = :userId) OR :userId=20", MyEntitiy.class);

【讨论】:

  • 不,我们没有中心位置。如果我们有,我就不会问这个问题了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多