динамические роли на сервере Java EE

Я хочу управлять пользователями и ролями в специальном приложении. Например, пользователь этого приложения («начальник клиентаX») может создать новую роль «сотрудник клиентаX». Если сотрудник обращается к серверу приложений Java EE (GlassFish 3), он должен получить роль «сотрудник customerX».

Звучит просто, но Java EE не поддерживает это, поскольку группы сопоставляются с ролями во время запуска, а роли в приложении статичны.

Как лучше всего управлять ролями пользователей во время выполнения в среде Java EE (6)?


person deamon    schedule 09.02.2010    source источник
comment
Я создал java.net/jira/browse/JAVAEE_SPEC-20 для поддержки (среди прочего) этот вариант использования. Если вас или кого-либо еще беспокоит отсутствие динамизма в ролях Java EE, проголосуйте за него или оставьте комментарий.   -  person Arjan Tijms    schedule 04.05.2013


Ответы (1)


Декларативная безопасность в Java EE действительно не подходит для таких требований. Проблему безопасности можно разделить на две части:

  • аутентификация
  • авторизация

Когда-то у меня было подобное требование. Мы использовали встроенную аутентификацию, чтобы установить принципала, а затем полагались на механизмы входа в систему Java EE по умолчанию. Но в итоге нам пришлось управлять частью авторизации вручную на прикладном уровне.

Действительно, даже роли, которые будут загружены и связаны с принципалом (isUserInRole для сети и isCallerInRole для EJB), должны быть указаны в web.xml или ejb.xml, что не обеспечивает достаточной гибкости. Затем нам пришлось загружать роли вручную (согласно принципалу) из LDAP или ActiveDirectory. Затем мы использовали перехватчики EJB3 и фильтр сервлетов для самостоятельной проверки безопасности.

Однако я бы настоятельно рекомендовал придерживаться управления доступом на основе ролей (RBAC) и не реализовывать что-то более причудливое. Есть несколько фреймворков, которые могут помочь справиться с самодельным RBAC.

Мы также рассмотрели JSecurity и Acegi Security, и они показались мне интересными.

person ewernli    schedule 09.02.2010
comment
Спасибо за ваш ответ, особенно за подсказку, что даже динамически устанавливаемые роли должны быть объявлены статически в web.xml или ejb.xml! Это было бы следующей ловушкой для меня. Я проверю JSecurity и Spring Security (преемник Acegi) static.springsource. org/spring-security/site/index.html. - person deamon; 09.02.2010
comment
JSecurity теперь называется Shiro. cwiki.apache.org/confluence/display/SHIRO/Index - person deamon; 09.02.2010
comment
Да, роли, объявленные с помощью <security-role> или @DeclaredRoles, на самом деле являются символическими именами, которые должны быть сопоставлены с ролью во внешнем каталоге (например, LDAP) с использованием <security-role-mapping>. Если сопоставление 1-к-1, у Glassfish есть опция сопоставления принципала с ролью по умолчанию, но это только половина решения, и вы все равно должны где-то указать роль. - person ewernli; 09.02.2010
comment
Также нет возможности фактически перечислить все роли пользователя с JEE API. Вам нужно будет перебрать фиксированный список ролей и использовать isCallerInRole или isUserInRole. Есть способ понизить Principal, а затем получить список ролей, но я думаю, что это не переносимо (точно не помню для этого). - person ewernli; 09.02.2010
comment
На самом деле, блог Рона Монзилло предлагает портативное решение для получения ролей Principal. - person Laird Nelson; 16.06.2011
comment
Еще одно замечание: по крайней мере, JBoss AS не требует, чтобы все роли были перечислены заранее. Если модуль входа помещает динамический список ролей в тему, вы можете протестировать тех, кто использует, например. is[Caller/User]InRole, и он вернет true, даже если эти роли нигде не были объявлены. - person Arjan Tijms; 10.02.2013