Как получить доступ к ролям JAAS в произвольной точке кода? - PullRequest
4 голосов
/ 09 февраля 2009

Я хочу получить доступ к полной модели пользователей с их ролями в моем приложении SOAP. Например, мне может понадобиться узнать роль пользователя с именем «Фред».

Как мне войти в какой-то глобальный реестр JAAS и сделать (псевдокод) globalRegistry.getUser ("Fred"). GetPrincipals () ? (Обратите внимание, что в JAAS роль представлена ​​ Principal .)

Я знаю, как получить Принципал Субъекта из LoginContext , но у него есть две проблемы.

  1. Это только в момент входа в систему, и я предпочел бы не кодировать вышеупомянутый реестр и сохранять объекты Subject и Principal самостоятельно, так как они уже сохранены сервер приложений.
  2. Желательно, чтобы я мог иметь доступ к этой информации, даже если Фред не является текущим пользователем.

Я использую Jetty, но я предполагаю, что это стандартное поведение для JAAS.

Ответы [ 5 ]

5 голосов
/ 07 января 2012

Шаблон, который я видел:

AccessControlContext acc = AccessController.getContext();
Subject subject = Subject.getSubject(acc);
Set<Principal> principals = subject.getPrincipals();

По сути, это находит субъект, в настоящее время связанный с текущим потоком, и запрашивает его принципалы.

Одним из примеров использования этого является Apache Jackrabbit RepositoryImpl . Это метод extendAuthentication, задача которого - определить, какие права на Jackrabbit имеет текущий поток при создании нового сеанса (я думаю).

Тем не менее, я должен отметить, что это не обязательно может работать, по крайней мере, в контексте J2EE. Я использую этот код под JBoss AS7, и он не находит тему. Это может быть просто ошибкой.

3 голосов
/ 09 февраля 2009

Мы используем переменную ThreadLocal для ссылки на текущего пользователя, который был аутентифицирован в точке входа системы (в нашем случае это сервлет или ejb). Это позволяет «глобальный» доступ к текущему пользователю. Это не связано напрямую с JAAS или любым другим протоколом безопасности, но может быть инициализировано из них.

РЕДАКТИРОВАТЬ: Возвращение от ThreadLocal является темой для текущего пользователя.

Доступ к другим пользователям обычно осуществляется через какой-либо тип модуля администратора.

1 голос
/ 25 мая 2010

Я считаю, что JAAS был спроектирован так, чтобы на самом деле не разрешать то, что вы пытаетесь сделать. Я знаю, что в приложениях, которые я создал, мне требовались такие функциональные возможности, которые требовались для обхода JAAS и программирования непосредственно в любое хранилище идентификаторов, будь то LDAP, ActiveDirectory или что-то еще.

1 голос
/ 09 февраля 2009

Мне кажется, это меняет пользователей appsever, группы и т. Д. С ролями приложений J2EE.

  • Получение разрешений определенного пользователя является задачей администрирования и обычно должно выполняться с использованием API-интерфейсов, специфичных для приложения.
  • Модель программирования JAAS работает на более высоком уровне абстракции. Он только предоставляет информацию, находится ли пользователь в роли J2EE (определенной в приложении)
0 голосов
/ 07 марта 2014

В EJB используйте

@Resource(mappedName = "java:comp/EJBContext")
protected SessionContext sessionContext;

И попробуйте с context.lookup("java:comp/EJBContext") в любой момент.


Этот код предназначен для семейства серверов JBoss, другие ищут его в JNDI.

...