В нашем проекте мы используем 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)
Любой совет, как реализовать это?
Hibernate есть понятие [filters] (http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch19.html#objectstate-filters), которые можно использовать для динамического добавления предложения в запрос. Мы сделали это успешно в одном из наших проектов. Для обычных пользователей данные были ограничены тем, что они могли видеть, для администраторов мы просто не добавляли дополнительное предложение. –
Другим вариантом является использование Spring Security вместо фильтров базы данных. Вы можете использовать Spring Security для применения ACL к вашим объектам. Хотя это может быть болью при настройке и может быть ударом производительности, когда у вас есть большие результирующие наборы. –