Вход в 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