Как переопределить j_security_check в Glassfish?
Я сейчас пользуюсь FORM
на основе аутентификации в Glassfish v2.1 для входа пользователей, и он работает нормально. Я хочу переключиться на ProgrammaticLogin
и я хочу иметь возможность получить изначально запрошенный URL-адрес (то есть до перенаправления на страницу входа в систему) и использовать его в своем программном коде входа в систему, чтобы пользователь перенаправлялся обратно на запрошенную страницу после аутентификации.
Я видел исходный код j_security_check
- в моем случае это FormAuthenticator
(кодовая база Catalina), и он сохраняет первоначальный запрос в SavedRequest
объект в сеансе, но этот сеанс является StandardSession
скорее, чем HttpSession
так что прямого доступа к нему нет.
Или я должен изменить механизм аутентификации с FORM
к чему-то еще?
Спасибо!
2 ответа
Хорошо, я нашел ответ. Итак, вот оно:
По сути, я пытался добиться реализации механизма аутентификации на основе openid в glassfish. Один из способов сделать это - использовать ProgrammaticLogin
но у этого есть несколько недостатков - простой способ перенаправления обратно на запрошенный URL-адрес и программная аутентификация означают больше работы для программиста. Так что после прочтения я нашел лучший способ достичь своей цели - модули проверки подлинности сервера или SAM. Это является частью стандартного процесса, описанного в JSR-196, и предоставляет способ создания подключаемых модулей авторизации для Glassfish (т.е. отличается от стандартного FORM
, BASIC
так далее.). Этот метод позволяет вам подключать новые модули аутентификации в контейнере сервлета, сохраняя при этом вашу декларативную модель безопасности.
Так что все, что мне нужно сделать, это написать свой собственный SAM. Вот краткое руководство:
Реализуйте интерфейс ServerAuthModule, который в основном сводится к следующему методу:
AuthStatus validateRequest(MessageInfo messageInfo, security.auth.Subject clientSubject, security.auth.Subject serviceSubject) throws AuthException
Упакуйте свой SAM в банку и поместите ее в директорию lib Glassfish.
Настройте SAM для использования с вашим приложением. Это делается в 2 этапа:
- Определите свой SAM в качестве поставщика безопасности сообщений в domain.xml.
- Свяжите SAM для использования с вашим приложением. Вы можете сделать это, определив атрибут httpservlet-security-provider в sun-web-app.xml вашего приложения. Задайте в качестве значения атрибута имя, которое вы присвоили SAM на шаге 1.
Для получения дополнительной информации прочитайте этот замечательный урок Рона Монзилло.
ОБНОВЛЕНИЕ: Существует более простое и элегантное решение этой проблемы, которое называется AuthenticRoast. Это библиотека Java, написанная Aike Sommer, которая позволяет вам создавать свои собственные подключаемые аутентификаторы.
Если у вас не работает аутентификация на основе форм, я бы рекомендовал перейти на использование ServletFilter для аутентификации. Вы просто избавляетесь от своей аутентификации на основе FORM и добавляете отображение в фильтр для страниц, которые вы хотите защитить.