2013-08-13 3 views
2

У нас есть задача сертифицировать наше приложение в Tomcat7, которое уже сертифицировано и работает в Websphere.Как удержать HttpServletRequest в модуле входа в Jaas в Tomcat

Наше приложение в websphere имеет пользовательский модуль входа JAAS и обеспечивает доступ к объекту HttpServletRequest с помощью обработчиков обратного вызова, как показано ниже, и мы устанавливаем связанную с пользователем информацию в объекте сеанса (который извлекается из запроса).

javax.security.auth.callback.Callback callbacks[] = new javax.security.auth.callback.Callback[3]; 
callbacks[0] = new javax.security.auth.callback.NameCallback(
      "Username: "); 
callbacks[1] = new javax.security.auth.callback.PasswordCallback(
      "Password: ", false); 
callbacks[2] = new com.ibm.wsspi.security.auth.callback.WSServletRequestCallback(
      "HttpServletRequest: "); 

Проблема заключается в том, что, как вы видите, приведенный выше код специфичен для websphere. Итак, мы хотим написать еще один пользовательский модуль для входа в Tomcat. Извините, это спроектировано кем-то другим.

Теперь, как я могу получить доступ к объекту HttpServletRequest/HttpSession в модуле входа в Jaas в Tomcat?

Примечание: я попытался использовать ThreadLocal для передачи пользовательской информации вместо HttpServeletRequest, но кажется, что не рекомендуется, поскольку потоки повторно используются из пула потоков в Tomcat, и могут возникнуть потенциальные проблемы (утечка памяти, информация о пользователе общий и т. д.), если мы не очистим ThreadLocal правильно.

+0

По сравнению с WAS Tomcat имеет очень ограниченные возможности, когда речь идет о JAAS. Вполне вероятно, что вам нужно будет изменить приложение. Есть ли что-либо, препятствующее заполнению объекта сеанса в сервлет-фильтре? – fnt

+0

Модуль регистрации JAAS выполняется перед сервлет-фильтром. Только модуль входа в JAAS знает информацию об аутентификации/авторизации, такую ​​как недопустимые учетные данные, закрытие учетной записи, истекший срок действия пароля, доступ запрещен и т. Д. Мне нужна эта информация, чтобы отобразить соответствующее сообщение об ошибке, если логин не удался. – kotacc

+0

Я все еще ищу решение через 1 год :) – kotacc

ответ

2

В Jboss, это может быть получить через:

HttpServletRequest request = (HttpServletRequest) PolicyContext 
         .getContext("javax.servlet.http.HttpServletRequest"); 

Но PolicyContext в JACC и Tomcat не поддерживает JACC еще. Он может быть поддержан в Tomcat 9, но с низким приоритетом Tomcat.

2

Вам не нужно получать HttpServletRequest в LoginModule. LoginModule - это версия хранилища идентификаторов JAAS, которая представляет собой базу данных/репозиторий для пользователей, их учетные данные и необязательные группы или роли.

В Tomcat LoginModule не является основным типом хранилища имен. Realm is, но Tomcat предоставляет мост, поэтому вы можете использовать LoginModule в любом случае. Но поскольку вы обнаружили, что использование JAAS в Java EE не является стандартным. Серверы вообще не используют JAAS или используют его иначе, чем любой другой сервер.

Что вы ищете, это механизм проверки подлинности , который несет ответственность за взаимодействие с запросом, ответом и сеансом. У Tomcat есть два интерфейса для этого: один - специфический для Tomcat, другой - стандарт Java EE.

  1. Authenticator см https://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/catalina/authenticator/package-summary.html
  2. ServerAuthModule см https://tomcat.apache.org/tomcat-9.0-doc/config/jaspic.html и http://docs.oracle.com/javaee/7/api/javax/security/auth/message/module/ServerAuthModule.html
Смежные вопросы