2015-12-14 6 views
11

У меня есть два Java WebApps, которые работают на том же JBoss сервере, но в другом домене:Войти в webapp2 от webapp1 использованием JAAS

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

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

+0

Как у вас есть другой порт1 и порт2 для одного и того же jboss? Это один экземпляр Jboss и port1 == port2? – sibnick

+0

Это один сервер (машина) с настройкой домена jboss. Таким образом, существует несколько экземпляров/групп серверов. Вторая группа имеет смещение порта. – user1884155

ответ

4

Что нужно для реализации Single sign-on (SSO) с использованием JAAS. Here вы можете найти учебник, который использует 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.

+0

Класс WebAuthentication больше не доступен в JBOSS 7. Я не уверен, почему он был удален. Есть ли альтернативы этому классу? – user1884155

+0

Пример, на который вы ссылаетесь, предполагает, что оба веб-приложения работают на одном экземпляре сервера. Я фактически использую JBOSS в режиме домена, и у меня есть два экземпляра сервера на одном физическом «серверном компьютере». Можно ли установить единый знак в нескольких экземплярах? – user1884155

+0

@ user1884155 Да 'SSO' работает через физические машины. – dan

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 единый вход в систему

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

EDIT

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

  1. Modify standalone.xml и добавьте <single-sign-on path="/"/> внутри <host> тег
  2. Добавить 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

+0

В настоящий момент у нас нет имени домена, настроенного в нашем web.xml. Что такое значение по умолчанию, если я не помещаю имя области? Вы говорите, что если я дам обоим веб-сайтам случайное имя (например: realmXYZ), я активирую какой-то секретный способ «единого входа», не требуя дальнейшей настройки? – user1884155

+0

Это не «секретный» единый вход. См. Мое редактирование – sibnick

+0

Оба моих веб-приложения используют один и тот же домен безопасности. То есть, в моем файле jQoss domain.xml у меня есть «xyz» домена secuerity, и в каждом файле japp-app.xml файла webapp я связываю их с этим доменом безопасности. Я нигде не задавал имя области. В чем разница/иерархия между именами областей и доменами безопасности? – user1884155