#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 в пользовательский / групповой механизм среды развертывания. Роли являются абстрактными… и пока ваше приложение не использует роль, сопоставление не требуется и не рассматривается.