Как переопределить 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. Вот краткое руководство:

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

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

Другие вопросы по тегам