Как переопределить j_security_check в Glassfish? - PullRequest
6 голосов
/ 14 июня 2009

В настоящее время я использую аутентификацию на основе FORM в glassfish v2.1 для входа в систему, и она работает нормально. Я хочу переключиться на ProgrammaticLogin и хочу получить изначально запрошенный URL-адрес (т. Е. Перед перенаправлением на страницу входа) и использовать его в своем программном коде входа в систему, чтобы пользователь перенаправлялся обратно на запрошенную страницу после аутентификации.

Я видел исходный код для j_security_check - в моем случае это FormAuthenticator (кодовая база каталины), и он сохраняет первоначальный запрос в объекте SavedRequest в сеансе, но этот сеанс скорее StandardSession чем HttpSession, поэтому прямого доступа к нему нет.

Или я должен изменить механизм аутентификации с FORM на что-то еще?

Спасибо!

Ответы [ 2 ]

8 голосов
/ 17 июня 2009

Хорошо, я нашел ответ. Итак, вот оно:

По сути, я пытался реализовать механизм аутентификации на основе openid в glassfish. Один из способов сделать это - использовать ProgrammaticLogin, но у него есть несколько недостатков - простой способ перенаправления обратно на запрошенный URL-адрес и программная аутентификация означает большую работу для программиста. Так что после прочтения я нашел лучший способ достичь своей цели - Модули аутентификации сервера или SAMs. Это часть стандартного процесса, описанного в JSR-196 , и предоставляет способ создания подключаемых модулей авторизации для Glassfish (т.е. отличается от стандартных FORM, BASIC и т. Д.). Этот метод позволяет вам подключать новые модули аутентификации в контейнер сервлета, сохраняя при этом вашу декларативную модель безопасности.

Так что все, что мне нужно сделать, это написать свой собственный SAM. Вот краткое руководство:

  1. Реализация интерфейса ServerAuthModule, который в основном сводится к следующему методу:

    AuthStatus validateRequest(MessageInfo messageInfo, security.auth.Subject clientSubject, security.auth.Subject serviceSubject) throws AuthException

  2. Упакуйте свой SAM в банку и поместите банку в директорию lib Glassfish.

  3. Настройте SAM для использования с вашим приложением. Это делается в 2 этапа:

    • Определите свой SAM в качестве поставщика безопасности сообщений в domain.xml.
    • Свяжите SAM для использования с вашим приложением. Вы можете сделать это, определив атрибут httpservlet-security-provider в sun-web-app.xml вашего приложения. Задайте в качестве значения атрибута имя, которое вы присвоили SAM на шаге 1.

Для получения дополнительной информации прочитайте этот замечательный урок Рона Монзилло.

ОБНОВЛЕНИЕ: Существует более простое и элегантное решение этой проблемы, которое называется AuthenticRoast . Это библиотека Java, написанная Aike Sommer, которая позволяет вам писать собственные подключаемые аутентификаторы.

1 голос
/ 15 июня 2009

Если у вас не работает аутентификация на основе форм, я бы порекомендовал перейти на использование ServletFilter для аутентификации. Вы просто избавляетесь от своей аутентификации на основе FORM и добавляете отображение в фильтр для страниц, которые вы хотели защитить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...