JAAS. Как поместить remoteUser в сессию?
От: Аноним  
Дата: 07.06.06 11:39
Оценка:
Есть рабочее J2EE приложение (А), которое использует внутреннюю аутентификацию и авторизацию не используя JAAS и также собственную библиотеку в качестве движка. Задача переписать это приложение так, что бы уйти от старого движка, но делать это по частям. Новое приложение (Б) должно использовать JAAS. Т.е. на переходном этапе приложение должно использовать одновременно и старый движок и новый (части А и Б).

Функционально логику работы приложения удалось разделить, остался вопрос аутентификации/авторизации.

Все страницы нового приложения защищены с использованием <security-constraint/> в web.xml

У приложения А есть login screen куда вводится имя пользователя и пароль.
Задача: при аутентификации пользователем в части А пройти аутентификацию и в части Б.

Для этого я написал LoginModule который содержит всю логику аутентификации.
Сам по себе он работает. Если посылать запрос j_security_check?j_username=username&j_password=passwd то после успешной аутентификации в сессии появляется пользователь username, имя котрого я могу получить через req.getRemoteUser().

Вопрос 1: Как мне провести аутентификацию в логин модуле не посылая запрос j_security_check?

Я делал так:

создал LoginContext и MyCallbackHandler(), описав там handle() инициализирущий должным образом имя пользователя и пароль.

LoginContext lc = new LoginContext("MyLoginModule", MyCallbackHandler());
lc.login();
log.debug( lc.getSubject() );
log.debug( req.getRemoteUser() );


Все этапы аутентификации проходят успешно. Subject создается правильно. А getRemoteUser возвращает null.
И на страницы защищенные <security-constraint/> меня не пускают

Вопрос 2: Как поместить subject в сессию так, что бы логин модуль понимал, что аутентификация уже выполнена.

Хм... Сумбурно получилось, но если коротко: надо выполнить аутентификацию не посылая запроса j_security_check.

Приложение работает под JBoss4.0, SAS7/SAS8.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.