Можно ли программно идентифицировать наличие модуля auth сервера в glassfish

Я включил модуль проверки подлинности сервера (JSR196) в Glassfish . Модуль работает, как и ожидалось, однако мне нужно программно определить наличие модуля аутентификации в сервлете.

Есть ли способ проверить наличие модуля проверки подлинности с помощью Java?

2 ответа

Подход Декстера Мейерса должен работать просто отлично при условии, что:

  1. ваше приложение использует одинServerAuthModule(СЭМ),
  2. нет AS-wide -ie был зарегистрирован вAuthConfigFactoryсnull appContextа также "HttpServlet" или же null layer arguments- AuthConfigProvider было установлено,
  3. Вы не предоставляете свой собственныйAuthConfigProvider,ServerAuthConfigа также ServerAuthContextреализации и
  4. Ваша единственная задача - получить подтверждение во время выполнения, что 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);
Другие вопросы по тегам