2014-12-08 3 views
0

В нашем проекте мы используем spring, JPA & hibernate over Mysql. У меня есть таблица DB, которая содержит разрешения для каждого пользователя. эта таблица имеет множество последствий для всей системы. Мне нужно добавить «супер пользователя»/admin, у которого есть разрешения для всего. Я хочу, чтобы каждый запрос, сделанный этим пользователем-администратором, «будет симулироваться», как и таблица разрешений, содержит разрешения для этого пользователя-администратора.Изменение запроса БД для конкретного пользователя

Например: В таблице БД -

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) 

Любой совет, как реализовать это?

+0

Hibernate есть понятие [filters] (http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch19.html#objectstate-filters), которые можно использовать для динамического добавления предложения в запрос. Мы сделали это успешно в одном из наших проектов. Для обычных пользователей данные были ограничены тем, что они могли видеть, для администраторов мы просто не добавляли дополнительное предложение. –

+0

Другим вариантом является использование Spring Security вместо фильтров базы данных. Вы можете использовать Spring Security для применения ACL к вашим объектам. Хотя это может быть болью при настройке и может быть ударом производительности, когда у вас есть большие результирующие наборы. –

ответ

0

Я полагаю, у вас есть центральный метод, где вы проверяете права. Если это так, просто попробуйте:

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); 
+0

Нет, у нас нет центрального места. Если бы у нас был один, я бы не стал задавать этот вопрос :) – yonatan

Смежные вопросы