Я слишком много думал об этом сейчас без явно правильного решения. Это может быть реальная ситуация «дрова за деревьями», поэтому мне нужна помощь stackoverflow.
Я пытаюсь обеспечить фильтрацию базы данных на региональной основе. В моей системе разные пользователи, и каждый из них назначен в региональный офис. Я только хочу, чтобы пользователи могли видеть данные, связанные с их региональным офисом.
Проще говоря, мое приложение: Java App -> JPA (hibernate) -> MySQL
База данных содержит объекты из всех регионов, но я только хочу, чтобы пользователи могли манипулировать объектами из своего региона. Я думал о следующих способах сделать это:
1) изменить все запросы к базе данных, чтобы они читали что-то вроде select * from tablex, где region = "myregion". Это противно Это плохо работает с JPA, например, метод entitymanager.find () принимает только первичный ключ. Конечно, я могу перейти на родной язык, но мне нужно пропустить только одно утверждение, и моя безопасность снята
2) использовать прокси-сервер mysql для фильтрации результатов. что-то странно, но затем прокси-сервер mysql просто видит необработанный вызов и не знает, как именно он должен их фильтровать (т.е. к какой области принадлежит пользователь, который сделал этот запрос). Хорошо, я мог бы запустить прокси для каждого региона, но он начинает становиться немного грязным ..
3) использовать отдельные схемы для каждого региона. да, просто, я использую Spring, чтобы я мог использовать RoutingDataSource для маршрутизации запросов через правильный источник данных (1 источник данных на схему). Конечно, проблема сейчас в том, что я хочу фильтровать по регионам и некоторым другим категориям. OHPs.
4) ACL - не совсем уверен в этом. Если a сделал выбор * из таблицы; будет ли он тихо отфильтровывать объекты, к которым у меня нет доступа, или будет выдано множество исключений доступа?
Но я слишком много об этом думаю? Это похоже на действительно распространенную проблему. Должно быть какое-то простое решение, которое я слишком глуп, чтобы видеть. Я уверен, что это будет что-то близкое к / или в базе данных, поскольку вы хотите фильтровать как можно ближе к источнику, но что?
Не ищите ложной рекламы - любые ссылки, ключевые слова, идеи, коммерческие предложения и предложения по продуктам с открытым исходным кодом будут очень полезны! спасибо.