Java

         

Декларативное описание прав доступа в J2EE.


В данном разделе я расскажу "совсем кратко" КАК подключать и описывать права доступа в EJB компонентах и не утверждаю, что для Web ресурсов все "точно так же", хотя сам принцип - точно такой же. При этом я не собираюсь изложить "все тонкости" и возможности, которые присутствуют в J2EE дескрипторах бинов, я только описываю "простейший подход", который далек от совершенства, но все-таки дает представление о сути темы "контроля доступа".

Как правило EJB компоненты, прежде чем их поместить в EAR модуль-приложение, компоненты группируются в отдельные JAR модули. Каждому такому модулю соответствует файл-дескриптор внутри него - ejb-jar.xml, в котором описываются все возможные параметры, описывающие разные характеристики, в том числе и касаемые "контроля доступа". Группировать ли EJB по некоторым логическим соображениям или "свалить их в кучу", создав только один JAR файл - это ваше личное дело и предпочтение. Я всегда стараюсь как в коде, так и в сборках, разные логические части системы "содержать отдельно" друг от друга.

Что вообще такое "роль"? Это некоторая строка, значение которой обозначает "разрешение, право доступа". В качестве значения этому разрешению лучше давать "логически понятное" название, исходя из вашего проекта, смысла этой роли и т.д. По своей сути, роль - это название "разрешения" (permission) для доступа к описанному этой ролью сервису (методу, интерфейсу, бину). Поэтому я дальше так и буду называть - "роль-право доступа ", хотя это, наверное, и не совсем правильно с "научной" точки зрения.

Контроль доступа в J2EE серверах, а значит и в JBoss, выполняется при помощи простой проверки двух списков. С одной стороны - это список "ролей-прав", которые будут извлечены и кэшированы для вызывающего клиента, когда он будет идентифицирован в системе. Данный список "прав доступа" в литературе имеет еще названия: client identity, security identities. С другой стороны - это список "ролей-прав", назначенных у EJB компонент в ejb-jar.xml дескрипторном файле. В литературе он обычно называется security roles. При обращении клиента к методам EJB, отдельные строки ролей-разрешений из этих двух списков "проверяются на совпадение", и должны присутствовать в обоих для успешного вызова определенного метода клиентом с определенным именем.


Если вы еще НЕ настраивали ejb-jar.xml дескрипторы на работу с "контролем доступа", то скорее всего он выглядит приблизительно так:

<ejb-jar> ............. <enterprise-beans> ............. <!-- ЗДЕСЬ ОПИСАНЫ БИНЫ с именами:
EJB_1, EJB_2, EJB_3 --> </enterprise-beans> <assembly-descriptor> <container-transaction> ............... <!-- ЗДЕСЬ ОПИСАНЫ АТТРИБУТЫ
ТРАНЗАКЦИЙ --> </container-transaction> </assembly-descriptor><ejb-jar>

Т.к. нас интересует только часть <assembly-descriptor>, то остальную часть я приводить не буду.

ejb-jar.xml

................................. <assembly-descriptor> <security-role> <description>Права вызова ЛЮБЫХ методов
у EJB компонент модуля</description> <role-name>ManageObjects</role-name> </security-role> <security-role> <description> Права вызова методов поиска
(findAll, findByPK, getFullObject) EJB компонент </description> <role-name>ViewObjects</role-name> </security-role> ................................... </assembly-descriptor>

В дескрипторе мы определили две роли или два разрешения с названиями - ManageObjects и ViewObjects. Далее эти роли мы назначим методам бинов. В этом же дескрипторе появляется описание такого вида:

<assembly-descriptor> ........................ <method-permission> <role-name>ManageObjects<
/role-name> <method> <ejb-name>EJB_1</ejb-name> <method-name>*</method-name> </method> </method-permission>

<method-permission> <role-name>ManageObjects</role-name> <method> <ejb-name>EJB_2</ejb-name> <method-name>*</method-name> </method> </method-permission>

<method-permission> <role-name>ManageObjects</role-name> <method> <ejb-name>EJB_3</ejb-name> <method-name>*</method-name> </method> </method-permission> <!-- Пользователи имеющие у себя роль-разрешение
ManageObjects, получат доступ к ЛЮБОМУ методу на ЛЮБОМ интерфейсе
бинов EJB_1, EJB_2, EJB_3, что указывается символом (*) в названии метода -->


Содержание раздела