2015-12-14 10 views
11

Ich habe zwei Java-Webapps, die auf dem gleichen Jboss-Server laufen, aber in einer anderen Domäne:Login webapp2 von WebApp1 JAAS mit

Alle Inhalte von beiden Seiten wird mit einem JAAS-Login-Modul gesichert. Ich möchte jetzt eine Schaltfläche in App1 erstellen, um auf eine Seite auf App2 zu gehen. Wie vorhergesagt, werde ich vom Loginscreen von App2 vorgestellt. Ich kann mich erfolgreich anmelden.

Allerdings sind Benutzer auf beiden Webapps eigentlich gleich. Das bedeutet, dass Benutzername/Passwörter, die für app1 gültig sind, auch für app2 gültig sind. Ich möchte etwas programmieren, um die redundante Sicherheitsprüfung zu umgehen. Wenn App 1 auf eine Seite von app2 zugreifen möchte, möchte ich den j_username und das j_password irgendwie an app2 weitergeben, damit App2 sofort die Sicherheitsprüfung durchführen kann. Es ist kein Problem, wenn ich zusätzlichen Controller oder jsp erstellen und eine Umleitung in diesem Prozess verwenden muss. Wie kann ich einen j_username und ein j_password direkt übergeben, so dass der Loginscreen nicht mehr angezeigt wird, aber die Sicherheitsprüfung noch durchgeführt wird?

+0

Wie können Sie Port1 & Port2 für den gleichen jboss haben? Ist es eine Jboss-Instanz und Port1 == Port2? – sibnick

+0

Es ist ein Server (Maschine), mit einer jboss Domain-Setup. Es gibt also mehrere Instanzen/Servergruppen. Die zweite Gruppe hat einen Port-Offset. – user1884155

Antwort

4

Was Sie benötigen, ist Single sign-on (SSO) mit JAAS zu implementieren. Here Sie können ein Tutorial finden, das LDAP als Login-Module verwendet, aber Sie werden die Idee bekommen.

Da Sie bereits den JAAS Teil bereits konfiguriert haben, müssen Sie nur auf den SSO Teil konzentrieren, der mit page 3 beginnend beschrieben wird. Grundsätzlich besteht die Idee darin, eines der Module so zu konfigurieren, dass es den Zustand mit useSharedState=true mit der anderen Anwendung teilt.

In Ihrem LoginModule Sie so etwas wie verwenden:

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  
} 

Da in der anderen Frage, die Sie erwähnt, dass Sie JBoss verwenden, da JBoss Version 5.0, können Sie verwenden:

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

Dies wird die SSO automatisch für Sie behandeln, wenn Sie die WebAuthentication Klasse verwenden.

+0

Die WebAuthentication-Klasse ist in JBOSS 7 nicht mehr verfügbar. Ich bin mir nicht sicher, warum sie entfernt wurde. Gibt es Alternativen zu dieser Klasse? – user1884155

+0

Das Beispiel, zu dem Sie verknüpfen, geht davon aus, dass beide Webapps auf derselben Serverinstanz ausgeführt werden. Ich benutze JBOSS tatsächlich im Domain-Modus, und ich habe zwei Server-Instanzen auf demselben physischen "Server-Rechner". Kann Single Sign On über mehrere Instanzen hinweg erreicht werden? – user1884155

+0

@ user1884155 Ja 'SSO' funktioniert über physische Maschinen hinweg. – dan

2

JAAS-Login funktioniert für Sicherheitsdomäne, nicht für Webapp. Sie sollten also beide Anwendungen in eine Sicherheitsdomäne legen. Es ist login-config Abschnitt in web.xml:

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

Es sollte für Single Sign-on innerhalb eines J2EE-Container genug sein.

EE.3.3.8.2 Web Einzelanmeldung

...... erfordern eine erneute Authentifizierung von Benutzern, wenn nur eine Domänengrenze Sicherheitspolitik hat:

Es wird in Java EE spec direkt angegeben gekreuzt ............

EDIT

nach einiger Entdeckung fand ich, dass SSO standardmäßig deaktiviert ist in Wildfliege.Zur Aktivierung SSO in Wildfly:

  1. Ändern standalone.xml und fügen <single-sign-on path="/"/> innerhalb <host> Tag
  2. Jboss-web.xml hinzufügen (sso - Ihre Sicherheitsdomäne)

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

Nach dieser Wildfly wird speziellen Cookie JSESSIONIDSSO für SSO verwenden

+0

Momentan ist in unserer web.xml kein Realm-Name konfiguriert. Was ist der Standardwert, wenn ich keinen Realm-Namen anlege? Willst du damit sagen, dass ich, wenn ich beiden Websites einen zufälligen Realm-Namen gebe (zum Beispiel: realmXYZ), einen geheimen Single-Sign-On-Modus aktiviert habe, ohne dass eine weitere Konfiguration erforderlich ist? – user1884155

+0

Es ist keine "geheime" einmalige Anmeldung. Siehe meine Bearbeitung – sibnick

+0

Beide meine Webapps verwenden die gleiche Sicherheitsdomäne. Das heißt, in meiner JBoss-Datei domain.xml habe ich eine Sicherheitsdomäne "xyz", und in der jboss-app.xml-Datei meiner Webanwendung verknüpfe ich sie mit dieser Sicherheitsdomäne. Ich habe nirgends einen Realm-Namen festgelegt. Was ist der Unterschied/die Hierarchie zwischen Bereichsnamen und Sicherheitsdomänen? – user1884155

Verwandte Themen