Хорошо, я нашел ответ. Итак, вот оно:
По сути, я пытался реализовать механизм аутентификации на основе openid в glassfish. Один из способов сделать это - использовать ProgrammaticLogin
, но у него есть несколько недостатков - простой способ перенаправления обратно на запрошенный URL-адрес и программная аутентификация означает большую работу для программиста. Так что после прочтения я нашел лучший способ достичь своей цели - Модули аутентификации сервера или SAMs. Это часть стандартного процесса, описанного в 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, которая позволяет вам писать собственные подключаемые аутентификаторы.