Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > EJB & JAAS


Автор: steals 27.7.2008, 17:16
Доброго времени суток.

Имеется задача написать аутентификацию/авторизацию для проги. Логика программы заключена в EJB 3.0. Список пользователей хранится в БД(postgresql). Запускается прга на аппсервере - glassfish 2

Для решения данной задачи было выбрано использовать JAAS. Написал свой LoginModule(почти). Вот только столкнулся с одной проблеммой, никак не могу получить ничего из базы используя JPA технологию. 

Существует ли какая-то возможность это реализовать или надо использовать методы по старинке(вручную коннектится к бд с помощью jdbc) ?

Заранее спасибо.

З.ы. хорошие статьи по реализации авторизации для ejb-компонентов приветствуются.

Автор: Ulysses4j 27.7.2008, 20:35
Каким боком JAAS связана с JPA? Если у вас JPA не фунциклирует, значит не смогли настроить: курите мануалы к апп-серверу на эту тему.

Автор: steals 28.7.2008, 10:01
Проблема была в том, что для определения EntityManager использовалась аннотация @PersistenceContext. Так вот в LoginModule по этой аннотации ничего не инжектилось. Заменил на :
Код

   EntittyManagerFactory emg =Persistence.createEntityManagerFactory("MyPU");
   EntityManager em = emf.createEntityManager();

и все в принципе заработало.

Теперь надо курить, как это все связать с авторизацией в ejb.

Автор: man_without_face 28.7.2008, 14:23
Вообще Acegi лучше приспособлена к ECM приложениям. На IBM были доки на русском. Во! Нашёл.

http://www.ibm.com/developerworks/ru/library/j-acegi1/
http://www.ibm.com/developerworks/ru/library/j-acegi2/
http://www.ibm.com/developerworks/ru/library/j-acegi3/

Автор: steals 29.7.2008, 12:20
Что-то я никак не пойму. Можно ли связать Атунтификацию через JAAS(собственный логин модуль) и авторизацию через декларативное описание в web.xml, ejb-jar.xml ?

Автор: man_without_face 29.7.2008, 14:00
вроде нет. если не изменяет память, нужно копать xml'ники в серверах приложений (JBoss, Tomcat). Кстати буки же есть по JAAS. ТАм наверняка всё написано.

Автор: steals 29.7.2008, 14:09
Вот и я все больше рпихожу к выводу, что не совмещаются эти технологии... :(
Хм... а через что тогда обычно люди делают такого рода авторизацию?

Уже кучу инфы перечитал в инете по джасу, но возможно я чего-то недопонимаю...

Автор: w1nd 30.7.2008, 10:16
Если вы хотите получить собственную реализацию авторизации и аутентификации для EJB, то вам следует обратить внимание на спецификацию JSR 115, она же JAAC, она же Java Authorization Contract for Containers. Но самое главное - документация того конкретного сервера, который хотите использовать. Необходимый вам функционал выходит за рамки EJB и JEE и у всех реализован по своему.

Автор: steals 30.7.2008, 10:27
Ну нужна пока авторизация и аутентификация для JSF, но в будующем понадобиться и для EJB.
Сейчас делаю по http://developers.sun.com/appserver/reference/techart/as8_authentication/index.html думаю поможет.

Автор: mbasil 30.7.2008, 12:20
Совершенно справедливо было отмечено, что у каждого сервера по своему.
Я довольно долго бился в Tomcat для того, чтобы заставить сервер принимать
специфическую JAAS аутентификацию. Думаю дело не в том, чтобы аутентифицировать,
а в том, чтобы заставить сервер принять эту аутентификацию, после этого
декларативная авторизация работает нормально.

Кстати Sun пишет, что аутентификация web контейнером должна приниматься
EJB контейнером, так что в этой части (с учетом сказанного выше) сомнений
быть не должно.

Автор: steals 30.7.2008, 15:09
Используется glassfish v2u2 как аппликейшен сервер.

Цитата(mbasil @  30.7.2008,  12:20 Найти цитируемый пост)
Думаю дело не в том, чтобы аутентифицировать,а в том, чтобы заставить сервер принять эту аутентификацию, после этогодекларативная авторизация работает нормально.


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


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

Автор: vzf 31.7.2008, 10:43
Что касается веб-приложений, обычно пишется свой логин-модуль и principals , эти реализации указываются в настройках сервера приложения. Всем остальным уже управляет контейнер и декларативное разграничение доступа нормально работает.  Что касается ejb - не знаю, но думаю должно-быть что-то похожее. 

В томкате, например, есть JAASRealm. Он позволяет использовать свой логин-модуль и свои principals. В документации к томкату довольно неплохо написано как его настроить. Вообще вопрос настройки JAAS для аутентификации/авторизации в веб-приложениях не раз уже здесь обсуждали. Посмотри поиском. Вот книгу приводили:

http://jaasbook.com/

Неплохая книга. Там рассказывается про JAAS и говорится как раз, как прикрутить свою реализацию логин-модуля к Tomcat'у при помощи его JAASRealm. Посмотри, может поможет.

Автор: mbasil 31.7.2008, 10:59
В Security FAQ для GlassFish имеется такое сообщение:

Цитата

The GlassFish authentication subsystem is built upon realm and the standard Java JAAS framework - you can write your own realm and JAAS login module, and plug it into GlassFish. In the current implementation of GlassFish, your realm and JAAS module needs to be derived from com.sun.appserv.security.AppservRealm and com.sun.appserv.security.AppservPasswordLoginModule respectively. You can configure a realm and JAAS module by modifying the config/domain.xml file (adding your realm configuration information there) and config/login.conf file (adding your login module there) respectively.


Попробуйте поискать примеры по названию классов

Автор: stron 31.7.2008, 18:07
Сделай 2 модуля:
1. JAAS login модуль
2. EJB, который будет работать с базой и отвечать за вытягивание оттуда пользователей. Через этом же модуль можно админить пользователей.
JAAS login модуль будет коннектиться к EJB, а тот уже к базе.

Автор: mturetskiy 29.8.2008, 16:41
Столкнулся с той же проблемой. Написал свои LoginModule, CustomRealm, сконфигурировал их в конфиге Glassfish-a.  Логин модуль срабатывает, связывается с Realm-ом для проверки данных, в итоге login проходит успешно. Однако не понятно, что надо сделать, что бы в EJB, которые я буду использовать дальше попадала эта инфа?
Насколько я понимаю эти данные попадают в EJB при создании с SecurityContext-ом. Причём этот контекст берётся из SecurityContext'a web-контейнера. Пробовал самостоятельно создавать Subject, заполнять его данными о пользователе и на его основе создавать SecurityContext, устанавливая его текущим. И это помогало. 
Вот только как это надо делать на самом деле? Может быть кто то знает?

Автор: dimka 24.10.2008, 18:24
Может так:
Код

LoginContext loginCtx = new LoginContext("myrealm", new CustomCallbackHandler("user","pass"));
         loginCtx.login();
         List<Book> books = (List<Book>) Subject.doAs(loginCtx.getSubject(), new PrivilegedAction<List<Book>>() {
             public List<Book> run() {
                 return serviceImpl.getAll(Book.class);
             }
         });

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)