У меня есть сценарий, когда пользователю с определенной ролью разрешено вызывать метод EJB на основе его собственного идентификатора. На элементе EJB у меня есть аннотация @RolesAllowed
с конкретной ролью пользователя. Для проверки на основе роли метод invoke работает отлично, однако, если пользователь в картинке вызывает метод bean, передающий идентификатор другого пользователя, метод все равно вызывается. Как избежать этого сценария с помощью RBAC или мне нужно добиться этого, используя любой альтернативный способ?Управление доступом одного пользователя к ресурсам другого пользователя на основе RBAC
ответ
Ваша логика приложения (логика аутентификации) должна препятствовать вызову метода с использованием другого идентификатора пользователя. В некотором роде, когда вы это делаете, вы подделываете чужую личность.
В аннотации @RolesAllowed
следует использовать роли, которые извлекаются на основе идентификатора пользователя, полученного из фреймворка, а не из значения, переданного пользователем вручную. Чтобы дать вам пример в мире сервлетов, вы должны использовать метод getUserPrincipal() объекта HttpServletRequest.
Я цитирую здесь абзац из учебника Java EE 6 о сервлетах. Вы можете экстраполировать одни и те же принципы на ejbs.
Проверка вызывающего абонента Удостоверение В Программная целом, управление безопасностью должно быть приведено в исполнение в контейнере таким образом, что является прозрачным для веб-компонента. API безопасности, описанный в этом разделе, должен использоваться только в менее частых ситуациях, когда методы веб-компонентов должны обращаться к информации контекста безопасности.
- Servlet 3.0 определяет следующие методы, которые позволяют получить доступ к информации о безопасности о вызывающей компоненте:
- getRemoteUser, которая определяет имя пользователя, с которым клиент аутентификацией. Метод getRemoteUser возвращает имя удаленного пользователя (вызывающего), связанного контейнером с запросом. Если ни один пользователь не прошел аутентификацию, этот метод возвращает null.
- isUserInRole, который определяет, находится ли удаленный пользователь в определенной роли безопасности. Если ни один пользователь не прошел проверку подлинности, этот метод возвращает false. Этот метод ожидает параметр роли ролей пользователя String.
Элемент security-role-ref должен быть объявлен в дескрипторе развертывания с подэлементом ролей-имен, содержащим имя роли, которое должно быть передано методу. Использование ссылок на роль безопасности обсуждается в разделе «Объявления и ссылки на ссылки на ссылки».
- getUserPrincipal, который определяет основное имя текущего пользователя и возвращает объект java.security.Principal. Если ни один пользователь не прошел аутентификацию, этот метод возвращает null. Вызов метода getName для принципала, возвращаемого getUserPrincipal, возвращает имя удаленного пользователя.
Приложение может принимать бизнес-логические решения на основе информации, полученной с использованием этих API.