LINUX.ORG.RU

Интеграция JAX-RS Token Auth и JavaEE Security

 


0

1

У меня есть 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. При логине юзера записываем данные в сессию, при логауте чистим сессию. На необходимые методы в бине вешаем перехватчик, в нём получаем данные из сессии, а по ним получаем пользователя.

Как проще/лучше/быстрее?



Последнее исправление: memnek (всего исправлений: 1)

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

1. Зависит от имплементации JAX-RS. Например тот же jersey умеет в OAuth. Кто-то наверняка умеет ещё что-то.

2. Да, но на сколько я знаю реализация будет серверозависимой. Самое простое что приходит в голову - в сервлет-фильтре выдирать юзерский токен и втыкать всё что нужно в тредлокал. А дальше разруливай как хочешь. Можно запилить свои секьюрити интерсепторы для того же томката, только авторы очень любят менять апи так что после переезда с 5 на 6 я зарёкся такими вещами баловаться. Отваливается всё и что б починить приходится курить исходники.

3. Да, наверное это проще, но ты будешь пихать в сессию объекты которые по-хорошему вообще должны быть стейтлесс.

Как проще/лучше/быстрее?

Лучше сделать правильно - загородить обращения к сервисам через серверные механизмы защиты. Будет ли это быстрее и проще хз.

ya-betmen ★★★★★
()
Ответ на: комментарий от ya-betmen

1. Не, я имею ввиду программно аутентифицировать не JAX-RS слой, а всё приложение. Нашёл LoginModule из java security, но там не всё просто.

2. С тредлокалами видел идею. Пока приложение крутится на 1 сервере - прокатит. В принципе, это пока самое простое, что нашёл.

3. В идеале так и надо. Но тогда возникает такой вопрос: как в java security (использую wildfly) программно создавать пользователей, сохранять их в БД (у меня, например, монга), доставать инфу о них из БД, и т.д. Хочется, чтобы управление юзерами было через админку самого сайта, а не через админку WildFly. Плюс, надо дать возможность «низшим» юзерам (т.е. не модерам и админам) самим регистрировать аккаунт, так что ручное создание через админку веб-сервера вообще отпадает. Была идея для обычных юзеров сделать 1 аккаунт на сервере, а уже внутри него создать мини-систему аутентификации, но это как-то костыльно.

memnek
() автор топика
Последнее исправление: memnek (всего исправлений: 1)
Ответ на: комментарий от memnek

3. Как ты думаешь серверная админка рулит юзерами? Наверняка через внутреннее апи. По хорошему тебе нужно курить секьюрити апи применительно к твоему серваку. Умение загородить приложение защиой и поднимать юзеров/роли через кастомный провайдер - базовый функционал сервака.

ya-betmen ★★★★★
()
Ответ на: комментарий от ya-betmen

Вот про внутреннее апи как раз мало инфы нашёл. Вообще, планирую использовать picket link, он вроде как гибкий, да и примеров куча.

memnek
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.