безопасность-сопоставление ролей не работает с файловым дескриптором

#jakarta-ee #ejb-3.0 #glassfish-3 #cdi

#джакарта-ee #ejb-3.0 #glassfish-3 #cdi

Вопрос:

Использование 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 in, чтобы получить рабочее сопоставление «пользователь — роль» request.isUserInRole ?

Ответ №1:

Аналогичный вопрос в Coderanch ссылается на 17.2.5.3 Объявление ролей безопасности, на которые ссылается код компонента спецификации EJB 3.1:

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

[…]

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

(Выделение мое)

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

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

Основная причина предоставления представления безопасности корпоративных компонентов — упростить работу разработчика. При отсутствии представления безопасности приложения, развертывающему требуется подробное знание приложения для безопасного развертывания приложения. Например, разработчик развертывания должен знать, что делает каждый бизнес-метод, чтобы определить, какие пользователи могут его вызывать. Представление безопасности, определенное поставщиком компонента или ассемблером приложения, представляет для развертывателя более консолидированное представление, позволяя развертывателю быть менее знакомым с приложением.

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

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

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

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

Комментарии:

1. > So, according to the spec the glassfish-web.xml is created by the Deployer — Я знаю, что вы просто ссылаетесь на спецификацию, но просто подумайте об этом; сколько проектов на самом деле имеют «deployer»? Конечно, не все из них, и я осмелюсь сказать, даже не большинство из них…

Ответ №2:

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