Вход в webapp2 из webapp1 с использованием JAAS

У меня есть два java webapps, которые работают на одном сервере jboss, но в другом домене:

Весь контент с обоих сайтов защищен с помощью логистического модуля JAAS. Теперь я хотел бы создать кнопку внутри app1, чтобы перейти на страницу на app2. Как и было предсказано, я представляю loginscreen из app2. Я могу успешно войти в систему.

Однако пользователи обоих веб-приложений фактически одинаковы. это означает, что имя пользователя/пароли, действительные для приложения1, также действительны для приложения2. Я хотел бы запрограммировать что-то, чтобы обойти избыточную проверку безопасности. Если приложение 1 хочет получить доступ к странице из app2, я хотел бы как-то пройти вдоль j_username, а j_password - в app2 sothat app2 может немедленно выполнить проверку безопасности. Это не проблема, если мне нужно создать дополнительный контроллер или jsp и использовать перенаправление в этом процессе. Как я могу напрямую передать j_username и j_password, чтобы экран входа в систему больше не отображался, но проверка безопасности все еще выполняется?

Ответ 1

Что вам нужно - реализовать Single sign-on (SSO) с помощью JAAS. Здесь вы можете найти учебник, который использует LDAP как модули входа в систему, но вы получите эту идею.

Поскольку у вас уже есть уже настроенная часть JAAS, вам нужно будет сосредоточиться только на части SSO, описанной начиная с page 3. В принципе, идея состоит в том, чтобы сконфигурировать один из модулей для совместного использования состояния с помощью useSharedState=true с другим приложением.

В вашем LoginModule вы будете использовать что-то вроде:

public boolean login() throws LoginException{
  // ...
  String username = null;
  String password = null;
  // check if useSharedState is true, if it is true, use the 
  // username/password from shared state.
  if ("true".equalsIgnoreCase(option_.get("useShardState"))) {
    username = (String)sharedStateMap_.get("javax.security.auth.login.name");
    password = (String)sharedStateMap_.get("javax.security.auth.login.password");
  } else {
    // get the username and password from the CallbackHandler
    Callback [] callbacks = {new NamePasswordCallback()};
    handler_.handle(callbacks);
    username = callback.getUserId();                
    password = callback.getPassword();
    //save the username and password into the shared state
    sharedStateMap.put("javax.security.auth.login.name",username);
    sharedStateMap.put("javax.security.auth.login.password",password);
  }
  // ... communicates with data store to authenticate this user     
}

Поскольку в вашем другом вопросе вы упомянули, что используете JBoss, так как версия JBoss 5.0, вы можете использовать:

<Valve className="org.apache.catalina.authenticator.SingleSignOn" debug="0"></Valve>

Это будет обрабатывать SSO автоматически для вас, если вы используете класс WebAuthentication.

Ответ 2

Вход в JAAS работает для домена безопасности, а не для webapp. Поэтому вы должны просто поместить оба приложения в один домен безопасности. Это раздел login-config в web.xml:

   <login-config>
        <auth-method>FORM</auth-method>
        <realm-name>ApplicationRealm</realm-name>
       <form-login-config> ...............</form-login-config>
   </login-config>

Этого должно быть достаточно для однократной регистрации внутри одного контейнера J2EE.

Он непосредственно указан в Java EE spec:

EE.3.3.8.2 Web Single Signon

...... Требуется повторная аутентификация пользователей только при пересечении границы домена политики безопасности............

ИЗМЕНИТЬ

После некоторого обнаружения я обнаружил, что SSO по умолчанию отключен в Wildfly. Для включения SSO в Wildfly:

  • Измените standalone.xml и добавьте <single-sign-on path="/"/> внутри тега <host>
  • Добавьте jboss-web.xml(sso - ваш домен безопасности)

       <jboss-web>
            <security-domain>sso</security-domain>
               <valve>
                  <class-name>org.apache.catalina.authenticator.SingleSignOn</class-name>
               </valve>
       </jboss-web>
    

После этого Wildfly будет использовать специальный файл cookie JSESSIONIDSSO для SSO