Как получить доступ к ролям JAAS в произвольном месте кода?

StackOverflow https://stackoverflow.com/questions/528938

Вопрос

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

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

Я знаю, как получить Главный принадлежащий Предмет из Контекст входа в систему, но здесь есть две проблемы.

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Один из примеров использования этого находится в Апачский кролик's РепозиторийImpl.Это в extendAuthentication метод, задача которого состоит в том, чтобы определить, какие права Jackrabbit имеет текущий поток при создании нового сеанса (я думаю).

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

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

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

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

При использовании EJB

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

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


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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top