Можно ли программно идентифицировать наличие модуля auth сервера в glassfish
Я включил модуль проверки подлинности сервера (JSR196) в Glassfish . Модуль работает, как и ожидалось, однако мне нужно программно определить наличие модуля аутентификации в сервлете.
Есть ли способ проверить наличие модуля проверки подлинности с помощью Java?
2 ответа
Подход Декстера Мейерса должен работать просто отлично при условии, что:
- ваше приложение использует один
ServerAuthModule
(СЭМ), - нет AS-wide -ie был зарегистрирован в
AuthConfigFactory
сnull appContext
а также"HttpServlet"
или жеnull layer
arguments-AuthConfigProvider
было установлено, - Вы не предоставляете свой собственный
AuthConfigProvider
,ServerAuthConfig
а такжеServerAuthContext
реализации и - Ваша единственная задача - получить подтверждение во время выполнения, что SAM "активирован" для вашего приложения.
В противном случае, неnull
вернуться изAuthConfigFactory#getConfigProvider(String, String, RegistrationListener)
может вводить в заблуждение, в том смысле, что оно не обязательно утверждает, что ваше приложение использует SAM, только то, чтоAuthConfigProvider
размещен на совместимом уровне и может удовлетворить потребности аутентификации вашего приложения, если остальные необходимые компоненты (ServerAuthConfig
и др.) также зарегистрированы.
Если вам дополнительно необходимо знать, какие именно SAM настроены для использования в вашем приложении, то, на самом деле, не существует стандартного способа сделать это, так как, в первую очередь,ServerAuthContext
не раскрывает свои инкапсулированные SAM (и само его приобретение черезServerAuthConfig#getAuthContext(String, Subject, Map)
в любом случае это не так просто, поскольку профиль сервлета JASPIC оставляет произвольным authContextID). Что в основном означает, что вам нужно будет либо реализовать свой собственный ServerAuthContext
(вместе с двумя дополнительными ссылками), чтобы получить эту функциональность, или, в качестве альтернативы, прикрепить идентификатор для представления SAM к HttpServletRequest
или же HttpSession
Если вам достаточно знать, какие SAM были запущены для индивидуальных запросов. Обратите внимание, что в случае, если вы предпочитаете использовать javax.servlet.http.authType MessageInfo
свойство обратного вызова для установки значения, возвращаемого HttpServletRequest#getAuthType()
вместо этого он будет работать только при успешной аутентификации, то есть когда ваш SAM validateRequest(...)
устанавливает неnull
гость Principal
и / или хотя бы одну группу AS Principal
и возвращается AuthStatus.SUCCESS
; в противном случае вы получите null
несмотря на установив свойство обратного вызова.
Это должно быть возможно, проверив AuthConfigProvider
, что можно сделать через:
Сначала определите вспомогательный метод:
String getAppContextID(ServletContext context)
return context.getVirtualServerName() + " " + context.getContextPath();
}
Затем вызовите этот код, когда ServletContext доступен, как в @WebListener
:
AuthConfigFactory factory = AuthConfigFactory.getFactory();
String appContextID = getAppContextID(context);
AuthConfigProvider provider = factory.getConfigProvider("HttpServlet", appContextID, null);