Интеграция JAX-RS Token Auth и JavaEE Security
У меня есть JavaEE-приложение, в котором есть несколько JAX-RS ресурсов и несколько EJB-бинов со всякой бизнес-логикой.
Для JAX-RS части есть самодельная система аутентификации:
-
public class User implements java.security.Principal
- сущность для юзера -
public class AppSecurityContext implements javax.ws.rs.core.SecurityContext
- контекст для jax-rs -
@NameBinding public @interface Authenticated
- аннотация для отметки, что метод или класс требует входа в систему -
public class SecurityFilter implements javax.ws.rs.container.ContainerRequestFilter
- фильтр, проверяющий HTTP-заголовок на наличие токена и устанавливающий запросу соответствующий SecurityContext (или вызывающий abortWith, если аутентификация не удалась) - Всякие сервисы для проверки токенов, логина/логаута, регистрации нового юзера и т.д.
Всё это работает хорошо, но в пределах самих JAX-RS ресурсов. Мне же нужно, чтобы информация о пользователе была доступна и в некоторых EJB-бинах через javax.ejb.SessionContext.
На SO пишут, что установка SecurityContext - это локальная штука в пределах JAX-RS слоя. Чтобы информация о текущем пользователе была в SessionContext всего приложения, нужно глобально подключить security-механизм на сервере (например, настроить через web.xml). Ещё говорят, что JavaEE Security - это «всё или ничего», т.е. тогда всю аутентификацию надо настраивать через неё.
В общем, вопросы такие:
1) Можно ли программным путём в самом приложении (а не через админку сервера) управлять пользователями: логинить их, регистрировать новых, изменять инфу, самому сохранять в БД и т.д? Например, в JAX-RS-фильтре получили токен из HTTP-заголовка, по токену нашли юзера. Есть-ли какой-нибудь метод в security api, чтобы залогинить этого пользователя во всей системе?
2) Есть ли способ добавить информацию о пользователе в SessionContext всего приложения? Я знаю, что JAX-RS фильтры и interceptor'ы могут добавлять что-то в контексты самих запросов/ответов. Ещё есть EJB-интерцепторы, которые могут добавлять в EJB-контекст свою инфу. Как их можно скрестить, чтобы достать юзера в контексте запроса (который устанавливается фильтром), и добавить в контекст сессии EJB?
3) Может есть вариант с использованием HTTP-сессий? Все JAX-RS ресурсы сделать SessionScoped. При логине юзера записываем данные в сессию, при логауте чистим сессию. На необходимые методы в бине вешаем перехватчик, в нём получаем данные из сессии, а по ним получаем пользователя.
Как проще/лучше/быстрее?