Benutzerauthentifizierung in Struts

Franz Degenhardt

Erfahrenes Mitglied
Hallo!

Ich plane gerade ein Projekt mit WAS und Struts. Ich benutze struts tiles, eine Weiterentwicklung von struts templates in struts 1.1.

Hat jemand Erfahrung mit Benutzerauthentifizierung und Session Management? Soll ich die Authetifizierung als Controler-Servlet umsetzen? Gibt es da noch eine andere schön generische Möglicheit.

Bin für alle Anregungen oder Hinweise auf Tutorials oder Beispiele dankbar.
Grüsse TrueSun
 
Es kommt darauf an wie grossen Aufwand du betreiben willst.

Mit JAAS hast du einen offiziellen Standard und ein Framework für Authentifizierung.
Ansonsten ist ein Controller eine gute Sache. Unter Struts lassen sich mit einem Controller sehr leicht Actions unterschiedlich schützen.

So kannst du 3 Subklassen von Struts Action definieren die wiederrum einen Protected Status haben.

z.b
Code:
public class PublicAction extends Action {
 
}

pubic class MemberAction extends Action {
}

public class AdminAction extends Action {

}

in deinem Controller kannst du die Aufgerufene Action follgendermassen auf den Protectstatus checken

Code:
...
    if(action instanceof MemberAction && 
       request.getSession().getAttribute("logedin")==null)  {
               // forward auf auth error action
    } else if (action instanceof AdminAction &&
                   request.getSession().getAttribute("adminlogedin")==null)  {
              // forward auf auth error action 
   }
----
 
Danke für die schnelle Antwort!
Ich werde mir mal JAAS anschaue und meine Erfahrungen damit dann nachreichen.

Grüsse TrueSun
 
Hallo zusammen!

JAAS war mir nach näherer Betrachtung ein bischen zu kompliziert. Statt dessen werde ich jetzt einen Controler im Zusammenhang mit dem Pattern "Action First" benutzen. Trotzdem brauche ich noch eine Möglichkeit, die URLs, die nicht auf *.do gemappt werden, global abzufangen und zu untersuchen.
In dem Zusammenhang ist wahrscheinlich ein Requestfilter einzusetzen.

Die Frage ist nur, kann ich beispielsweise *.jsp auf diesen Filter mappen oder wie wird das sonst geregelt. Im Webspere Studio ist nämlich keine Möglichkeit vorgesehen, mappings mit wildcards zu verwenden. Und ändere ich von Hand die web.xml, kommt danach das Studio mit den Änderungen nicht klar.

Hat da jemand Erfahrungen?

Grüsse TrueSun
 
Ist zwar schon etwas angestaubt, aber hier mal mein Vorschlag:

Man muss ja nicht gleich JAAS verwenden, aber Container managed authentication ist eine gute Lösung.
Mit form based authentication (2 jsps für login und failed) und einer Anpassung im Deployment descriptor ( registrierung der Authentication, erstellen eines security constraints und erstellen von ein paar Rollen) hat man das Grundgerüst gemacht.
Nun noch im Container einen Security Realm definieren, damit der auch weiß, mit welchen Daten er autentifizieren soll (z.B. JDBC, JNDI, Datasource, dazu die nötigen Attribute) und man hat seine Security. Bei struts kann man nun die einzelnen Actions mit rollen versehen, so dass nur diese Rollen die Action ausführen dürfen. Man muss dabei aufpassen, dass das auf die Securlity constraints in der web.xml passt.

Leider funktioniert so nur active authentication - also Authentication nur bei Zugriff auf gesperrte Ressources und nicht einfach so (wie z.B. in einem Forum).

Bei Stuts 1.2 noch die HTTP 403 abfangen, um nicht authorisierte Benutzer zu warnen, struts 1.1 liefert das leider als 400 zurück.

Im allgemeinen sollte man für portable Anwendungen Security und Applikationslogik immer trennen, was über diesen Weg sehr gut gelöst ist.
 
Hallo!

Ich habe zu diesem Thema noch ein kleines Verstädnisproblem. Ich möchte innerhalb einer Tomcat 5.0.29er Umgebung Container Managed Authentification & Authorization verwenden.
Ich verwende Struts 1.24 für mein Projekt und habe nun schon ein login Formular entworfen und mache die Authentifizierung derzeit "händisch" per JDBC und einer Oracle Datenbank.
Nun gibt es ja diese verschiedenen Realm Arten (Datasource Realm, JDBCRealm etc.) bei welchen aber doch immer(?) eine MessageBox aufpoppt wleche Benutzername und Kennwort wissen will.... wie man es Beispielsweise von mit htaccess geschützten Internetseiten kennt. Ist es nun möglich auch von Struts aus mit diesen Realms zu arbeiten, sprich kann ich die Daten aus meiner Struts LoginForm irgendwie an die Realm Authentifizierung übergeben? Wenn das ginge wäre's Klasse, da ich dann auch gleich die Authorisierung dem Container überlassen könnte und innerhalb meiner Actions ...isUserInRole(....) verwenden könnte.

gruß Tom
 
Nachtrag:

Hab gerade hier: http://jakarta.apache.org/tomcat/tomcat-5.0-doc/realm-howto.html
ganz unten bei:

The example application shipped with Tomcat 5 includes an area that is protected by a security constraint, utilizing form-based login.

Ein Beispiel gefunden wie man das ganze realisieren kann. Jedoch basiert das Beispiel auf fest in der web.xml hinterlegten Benutzer-/Rolledaten.

Hat jemand vielleicht ein Beispiel dazu parat wie man das Beispielsweise mittels eines JDBC- oder DatasourceRealm hinbekommt?

Nachtrag2:
Verwende momentan:
http://www.josso.org/

Gruß Tom
 
Zuletzt bearbeitet:
@Tom, hast du dein Problem schon gelöst? Wenn ja wie?

@Christian, könntest du dein Beispiel etwas genauer beschreiben? Mir ist noch nicht ganz klar wie du einer Rolle die verschiedenen Actions zuweist (z.B. MemberAction). Wie soll der Controler aussehen?

Gruß
 
Zuletzt bearbeitet:
Hallo!

Ich habe mittlerweile einen JDBC Realm zur Benutzerauthentifizierung in Struts verwendet. Das dazugehörige Login-Formular habe ich ebenfalls mit Containermitteln erstellt. Nun prüfe ich in jeder Action ob der Aufrufer die entsprechende Rolle besitzt und leite dann dem entsprechend weiter. Wenn man die Container eigenen Authentifizierungsmechanismen verwendet, werden alle notwendigen Informationen (wie aktueller Benutzer und zugeteilte Rollen) schon vom Container aus in der HttpSession gespeichert. Man muss sich also nicht mehr darum kümmern. Man kann dann einfach über den request durch die Methode getUserPrincipal() den gerade "aktiven" Benutzer bekommen.

Gruß Tom
 
Hallo Tom,

ich habe meine Athentifizierung jetzt auch mit einem JDBCRealm realisiert. Das funktioniert in Verbindung mit Struts sehr gut (die aktuelle role wird auch in den Strutstags(logic:present) erkannt sowie bei den Actions in der struts-config).
Wenn es jemanden interessiert, hier mal eine ganz gute Anleitung:
http://www.onjava.com/lpt/a/2411
 
Zuletzt bearbeitet:
Zurück