# Komplett manuelle Authentifizierung mit JSF



## mschill (3. Sep 2008)

Hallo
Ich baue eine JSF-Anwendung. Die Authentifizierung läuft über einen bereits vorhandenen ZOPE-Server. Dieser schreibt ein cookie, welches mir ermöglicht, das Login zu übernehmen. Wie kann ich dem Java Application Server einfach sagen, das jetzt diese Person eingelogt ist, ganz ohne über ein Login-Form oder ähnliches zu gehen?

Danke,
Mischael Schill


----------



## mschill (3. Sep 2008)

Gibt es irgendeine Möglichkeit innerhalb eines JSPs oder eines JSF direkt die Authentifizierung zu starten ohne über ein Form, ein HTTP-Auth oder ähnliches zu gehen? Ich finde immer nur Möglichkeiten den aktuell eingeloggten User zu erhalten, aber nie eine Java-Methode welcher ich username & passwort übergeben kann und es sich so authentifiziert.


----------



## maki (3. Sep 2008)

Was nutzt denn ZOPE zur Authentifizierung?


----------



## mschill (3. Sep 2008)

ZOPE hat seinen eigenen Authentifizierungsmechanismus, den man nicht teilen kann. Der Server schreibt aber ein Cookie mit einer zufälligen Nummer, welches beim Übergang auf den Java-Server ausgelesen wird und mit diesen Informationen kann ich den Usernamen des eingeloggten bestimmen. Dazu muss ich einfach wissen, wie ich ganz manuell aus Java-Code heraus dem Application Server sagen kann, dass jetzt dieser User sich authentifiziert hat.

Sprich: Ich habe username und passwort vom momentanen Request in zwei variablen und will die jetzt dem Container übergeben. Direkt.

Die einzige Lösung, welche ich bis jetzt gefunden habe, ist ein Form based login, welches automatisch mit username und passwort ausgefüllt wird und sich sofort per JavaScript absendet. Das ist ein extrem hässlicher Work-Around.


----------



## SnooP (4. Sep 2008)

So ganz versteh ich's nich  .. du bist also via ZOPE bereits angemeldet und hast nen Cookie in dem ne id steht... dann willst du auf deine jsf-app zugreifen und möchtest dieser applikation mitteilen, dass wenn das cookie existiert mit der id, das der user angemeldet ist?

Vielleicht wären Servlet-Filter für dich interessant? Diese werden z.B. vor jedem Request vom Container verarbeitet und dort könntest du dann solche Überprüfungen machen...


----------



## Guest (4. Sep 2008)

Nein, wie das genau mit dem ZOPE geht ist uninteressant. Ich habe in meinem JSP den Usernamen und das Passwort (über ein Cookie erhalten, aber das spielt keine Rolle) in zwei Variablen und will jetzt die momentane Sitzung mit diesen Angaben authentifizieren.


----------



## Fats (5. Sep 2008)

Das Problem hab ich glaub ich verstanden, aber auch keine direkte Lösung. Vielleicht ein, zwei Gedanken, vielleicht auch nochmal mit anderen Worten umschrieben - vielleicht hilfts?!

Wir befinden uns irgendwo in den Weiten eines Servers (Tomcat und Co), ob im JSP oder in einer Java Klasse -egal. Wir können auf die Session und die verschiedenen Contexte zugreifen. Und: wir haben zwei Zeichenketten, eins ist ein Username und eins ein Passwort. 

Aus anderen WebApps ist bekannt, daß man sich zB. per PopUp Fenster (das Browsereigene - like htaccess beim Apachen) oder Login Formular am Server anmelden kann. Dieser vergleicht die Userdaten (zB.) anhand der user.xml im tomcat-conf Ordner und sagt dem  Tomcat "Hey, das hier ist ein User!" 
Die nachfolgende WebApp kann dann den Server nach den entsprechenden Userdaten fragen: ist wer eingeloggt? wenn ja, wie heißt er? usw....


```
String user = request.getRemoteUser();
boolean inRole = request.IsUserInRole("Admin");
```

Aus alten Tagen weiß ich noch: Wenn man das Login per Web-Form baut, dann müssen ein paar Bedingungen erfüllt sein: Das Feld für den Usernamen muß "j_username" und für Passwort "j_passord" heißen. Die Action Methode muß an "j_security_check" gehen. Der Servlet Container fängt diese Requests gezielt ab. ( Ob das auch heute noch so ist? )
Wie man diesen Vorgang nun aus einer Klasse heraus initiieren kann, weiß ich leider nicht.

Andere Frage: schreibst Du Deine JSF Anwendung selbst? Wenn ja, dann fragt doch selbst ab, ob es einen User gibt und schreib ihn Dir direkt in die Session und werte in Deinen Klassen aus, ob dort ein User existiert. Vielleicht brauchst Du die "offiziellen" Methoden des Requst-Objects ja gar nicht ... 


Vielleicht hilfts ja etwas weiter. Viel Erfolg und viele Grüße
Fats


----------



## aike (8. Sep 2008)

Welchen Container nutzt du denn? Im Glassfish ist JSR-196 für die Authentifizierung unterstützt, im Tomcat liesse sich eine Authenticator-Valve erstellen.

Auf meiner Homepage findest du auch eine kleine Library, die dies etwas einfacher macht. Inklusive fertigen Klassen zB für eine Authentifizierung mit Tickets (One-Time-Tokens).
Aktuell enthält diese nur ein JSR-196 Modul, aber ich arbeite derzeit auch an einer Applikation mit embedded Tomcat und habe bereits eine "Alpha-Version" einer Tomcat-Valve für die gleiche API. Dies werde ich in den nächsten Tagen online stellen.

Hoffentlich hilft das weiter!


----------



## mschill (9. Sep 2008)

Danke für die Antworten.

Ich kann leider nicht selber die Userdaten abfragen, da dies ja der ZOPE-Server macht. Ich erhalte einfach über Umwegen mindestens den Usernamen.

Ich  verwende den Glassfish V2, hat der irgendetwas das mir hier helfen könnte? Was hat es mit JSR 169 auf sich?


----------



## aike (9. Sep 2008)

Ja... Im Glassfish kannst du einen JSR-196 Authenticator erstellen, welcher dann auf beliebige Art und Weise die Authentifizierung durchführen kann!
Es gibt leider nicht sooo viel Doku darüber wie man sich wünschen würde und das JSR selber ist für die meisten Entwickler wohl etwas zu "technisch"  :wink: 

Am ehesten findet man zB über die Sun-Blogs Infos:
Pluggable Authentication in the Glassfish Web Tier

Alternativ kannst du dir halt mal meine Lib anschauen:
AuthenticRoast
Entweder nur um ein Beispiel zu haben, wie die API funktioniert, oder aber um die Lib selber zu nutzen...


----------



## mschill (9. Sep 2008)

Naja, authentifiziert darf es schon gegen die "normale" Benutzer-Datenbank, welche ich über MySQL ansteuern kann. Nur muss ich den Prozess manuell (also aus Java-Code) starten können. Und das JSR betrifft, wenn ich das richtig verstanden habe, nur die Methode der Authentifizierung, ähnlich JAAS nur etwas flexibler.


----------



## aike (9. Sep 2008)

Ich versteh grad nicht so ganz wo der Haken ist... Du schreibst, du bekommst in nem Cookie die Userdaten übermittelt, dann kannste doch einfach aus dem HttpServletRequest-Objekt die Daten auslesen wenn dein JSR-196 AUthenticator invoked wird!
Und was du dann mit den Daten machst liegt bei dir, entweder du checkst sie selber über die MySQL-DB oder du richtest einen Realm ein um sie davon überprüfen zu lassen.
Und zum Schluss wird der Principal registriert und Success zurückgegeben... Wie das ganze im einzelnen funktioniert ist am einfachsten nachzuvollziehen wenn du dir den Quell-Text mal anschaust.


----------



## Guest (10. Sep 2008)

Ah ok, hatte wohl gerade ein bisschen eine Blockade


----------

