сопоставление ролей безопасности не работает с дескриптором файла - PullRequest
4 голосов
/ 29 сентября 2011

Использование glassfish 3.1.1 для проекта Java EE6 сопоставление ролей безопасности, определенное в glassfish-web.xml, не влияет на сопоставление «роль пользователя».

Вызов request.isUserInRole("USER"), а также request.isUserInRole("ADMIN") всегда возвращает false.

GlassFish-web.xml

<glassfish-web-app>
    <security-role-mapping>
        <role-name>ADMIN</role-name>
        <group-name>ADMIN</group-name>
    </security-role-mapping>
    <security-role-mapping>
        <role-name>USER</role-name>
        <group-name>USER</group-name>
    </security-role-mapping>
</glassfish-web-app>

С пометкой LoginBean.java с @DeclareRoles, как показано ниже, роли назначаются, как и ожидалось.

LoginBean.java

...
@DeclareRoles({"ADMIN", "USERS"})
@Named(value = "loginBean")
@RequestScoped
public class LoginBean implements Serializable { ...

Зачем мне нужен @DeclareRoles в LoginBean.java для того, чтобы получить рабочее сопоставление «роль пользователя» для request.isUserInRole?

Ответы [ 2 ]

4 голосов
/ 07 октября 2011

A аналогичный вопрос на Coderanch цитирует 17.2.5.3 Декларация ролей безопасности, на которые ссылается код Бина спецификации EJB 3.1 :

Поставщик бина отвечает за использование DeclareRoles аннотация или security-role-ref элементы развертывания дескриптор для объявления всех имен ролей безопасности, используемых в код корпоративного бина. DeclareRoles аннотация указана на класс бина, где он служит для объявления ролей, которые могут быть проверены вызов isCallerInRole изнутри методов аннотированного класса. Объявление ролей безопасности позволяет Bean Provider, Application Assembler или Deployer для связи этих имен ролей безопасности используется в коде для ролей безопасности, определенных для собранного приложение.

[...]

Если аннотация DeclareRoles не используется, поставщик компонентов должен используйте элементы security-role-ref дескриптора развертывания для объявите роли безопасности, указанные в коде.

(Акцент мой)

Так что это просто подсказка для Deployer, и им не нужно интерпретировать код, чтобы получить список используемых ролей. Это может быть очень сложно, если разработчик вызывает метод isUserInRole() с именем роли, которое происходит из другого метода или из очень сложной логики.

Это также может быть полезно (из 17.3 Обязанности поставщика компонентов и / или приложения-ассемблера ):

Основная причина для обеспечения безопасности зрения предприятия Beans - это упрощение работы Deployer. В отсутствие безопасности Для просмотра приложения Deployer необходимо детальное знание приложение для безопасного развертывания приложения. Например, Развертывание должно знать, что делает каждый бизнес-метод определить, какие пользователи могут позвонить. Представление безопасности, определенное Bean Provider или Application Assembler представляет более консолидированный представление о Deployer, позволяющее Deployer быть менее знакомым с приложение.

(Я вижу, что вопрос касается веб-приложения, но я думаю, что причина этого та же, а спецификация сервлета не столь детальна.)

С Обязанности разработчика: назначение ролей безопасности (17.4.2) :

Deployer назначает участников и / или группы участников (например, отдельные пользователи или группы пользователей), используемые для управления безопасностью в операционная среда для ролей безопасности, определенных с помощью DeclareRoles и RolesAllowed аннотации метаданных и / или security-role элементы дескриптора развертывания.

Таким образом, согласно спецификации glassfish-web.xml создается Deployer (не Bean-провайдером или сборщиком приложений), и для работы Deployer ему нужны имена ролей из аннотаций метаданных "DeclareRoles и RolesAllowed и / или security-role элементов дескриптора развертывания. "

1 голос
/ 03 октября 2011

Отображение ролей в файле glassfish-web.xml переводит имена ролей безопасности приложения Java EE в механизм пользователя / группы среды развертывания.Роли являются абстрактными ... и пока ваше приложение не использует роль, сопоставление не требуется и не используется.

...