Управление доступом одного пользователя к ресурсам другого пользователя на основе RBAC

У меня есть сценарий, в котором пользователю с определенной ролью разрешено вызывать метод EJB на основе его собственного идентификатора. В компоненте EJB у меня есть аннотация @RolesAllowed с конкретной ролью для пользователя. Для проверок на основе ролей вызов метода работает нормально, однако, если пользователь на картинке вызывает метод bean-компонента, передавая идентификатор другого пользователя, метод все равно вызывается. Как избежать этого сценария с помощью RBAC или мне нужно добиться этого любым другим способом?


person jay    schedule 06.01.2015    source источник


Ответы (1)


Логика вашего приложения (логика проверки подлинности) должна предотвращать вызов метода с использованием другого идентификатора пользователя. В некотором смысле, когда вы делаете это, вы подделываете чью-то личность.

Поэтому аннотация @RolesAllowed должна использовать роли, которые извлекаются на основе идентификатора пользователя, полученного из фреймворка, а не на основе значения, переданного пользователем вручную. Чтобы дать вам пример в мире сервлетов, вы должны использовать метод getUserPrincipal() объекта HttpServletRequest.

Я цитирую здесь абзац из руководства по Java EE 6 по сервлетам. Вы можете экстраполировать те же принципы на ejbs.

Программная проверка идентификации вызывающего абонента В общем случае управление безопасностью должно осуществляться контейнером таким образом, чтобы он был прозрачным для веб-компонента. API безопасности, описанный в этом разделе, следует использовать только в менее частых ситуациях, когда методам веб-компонента требуется доступ к информации контекста безопасности.

  • Сервлет 3.0 определяет следующие методы, которые позволяют вам получить доступ к информации о безопасности вызывающего компонента:
  • getRemoteUser, который определяет имя пользователя, под которым клиент прошел аутентификацию. Метод getRemoteUser возвращает имя удаленного пользователя (вызывающего), связанного контейнером с запросом. Если ни один пользователь не прошел проверку подлинности, этот метод возвращает значение null.
  • isUserInRole, который определяет, находится ли удаленный пользователь в определенной роли безопасности. Если ни один пользователь не был аутентифицирован, этот метод возвращает false. Этот метод ожидает параметр имени роли пользователя String.

Элемент security-role-ref должен быть объявлен в дескрипторе развертывания с подэлементом role-name, содержащим имя роли, которое будет передано методу. Использование ссылок на роли безопасности обсуждается в разделе Объявление и связывание ссылок на роли.

  • getUserPrincipal, который определяет основное имя текущего пользователя и возвращает объект java.security.Principal. Если ни один пользователь не прошел проверку подлинности, этот метод возвращает значение null. Вызов метода getName для принципала, возвращенного getUserPrincipal, возвращает имя удаленного пользователя.

Ваше приложение может принимать бизнес-логические решения на основе информации, полученной с помощью этих API.

Источник: Использование программной безопасности в веб-приложениях

person David Brossard    schedule 08.01.2015