# Tomcat-Auth. in JSF?



## SaschaLR (12. Apr 2006)

Hallo Leute!

Jetzt hab ich mal eine Frage zu Tomcat und JSF.

Ich nutze zur Zeit Security Constraints von Tomcat um Zugang zu bestimmten Teilen zu sichern. Ein Login per Formular ist nötig.

Langsam wäre es auch schön, wenn der gesicherte Bereich personalisiert wäre. Daher wollte ich mal fragen ob ich die Benutzerdaten, die bei der Anmeldung (Tomcat) in einem Formular eingegeben werden auch gleich irgendwie in JSF nutzen kann, ohne dass ich den User nochmal bitten muss sich an der Applikation anzumelden? Oder muss ich dazu auf die Tomcat-Anmeldung verzichten und alles selbst regeln?

Das Problem, dass sich bisher für mich ergibt ist, dass wenn ich eine JSF-Form benutze um den Username in eine Backingbean zu bekommen, das Name-Attribut der Eingabefelder auf "form_name:j_username" und "form_name:j_password" gesetzt wird und Tomcat damit nicht mehr arbeitet.

Dank und Gruß, Sascha


----------



## Gumble (12. Apr 2006)

ich hab mal mit einem org.apache.catalina.Valve Objekt das hingewurstet. Aber auch nur aus dem Netz uebernommen. Dort kannst Du im Request Objekt rumfummeln und imho aus 'form_name:j_username' 'j_username' machen. Habs aber nicht mehr im Kopf. 
Ist aber imho mehr ein Workaround. 
Da mich das Thema interessiert und ich meine Webapp, an der ich gerade bastel, auch noch sichern möchte, hab ich mal in Sun's jsf forum gesucht - da gibts genug Beitraege zu dem Thema.
ungelesen:
http://forum.java.sun.com/thread.jspa?threadID=594623&messageID=3144980


----------



## SaschaLR (12. Apr 2006)

Danke für die Antwort!

Die Idee mit Valve ist zwar nicht was ich erhofft hatte, aber könnte ganz gut funktionieren. Werde das mal versuchen.

Also, das aus dem Link von dir habe ich mal überflogen, aber es sieht nach etwas viel zu sehr zurechtgebasteltem aus.

Also, wenn es keine vorgesehenen Funktionen für sowas gibt ist wärs schade ...

Sascha


----------



## SaschaLR (12. Apr 2006)

Haha!

Ich habs gefunden!!!


```
FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
```

Das ist schon die ganze Magie!!!

Gefunden habe ich es hier: 

http://swforum.sun.com/jive/thread.jspa?threadID=57947&messageID=218973

Danke für die Hilfe bisher, hab ja dennoch was gelernt  !!!

Sascha


----------



## Gumble (12. Apr 2006)

evtl auch: 
FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName()

Aber dann bist du ja schon durch das j_security Servlet gelaufen, denn dieses setzt ja die Werte im Kontext. D.h. man muss die Login-Page vor der eigentlichen JSF App bauen. 

Hast Du ein eigenes LoginModul geschrieben?

bin immer noch auf der Suche nach der perfekten JAAS+JSF Integration...


----------



## SaschaLR (12. Apr 2006)

Gumble hat gesagt.:
			
		

> Hast Du ein eigenes LoginModul geschrieben?
> 
> bin immer noch auf der Suche nach der perfekten JAAS+JSF Integration...



Was genau meinst du damit?

Also, ich habe bisher nur die ganz normalen Tomcat-Möglichkeiten genutzt um einen formularbasierten Login gegen eine MySQL DB zu machen.

Also, die DB und das pasende Mapping bekanntgemacht (in der server.xml) und halt die web.xml der Applikation so angepasst, das es einen geschützen Bereich gibt. 


```
<Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
		driverName="com.mysql.jdbc.Driver"
		connectionURL="jdbc:mysql://localhost/authority"
		connectionName="tomcat" connectionPassword="xxx"
		userTable="users" userNameCol="user_name" userCredCol="user_pass"
		userRoleTable="user_roles" roleNameCol="role_name"
		digest="md5"/>
```


```
<security-constraint>
		<display-name>Security Constraint</display-name>
		<web-resource-collection>
			<web-resource-name>Protected Area</web-resource-name>
			<url-pattern>/secure/*</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>admin</role-name>
		</auth-constraint>
	</security-constraint>
	<login-config>
		<auth-method>FORM</auth-method>
		<realm-name>Form-based Authentication</realm-name>
		<form-login-config>
			<form-login-page>/secure/login.jsf</form-login-page>
			<form-error-page>/secure/denied.html</form-error-page>
		</form-login-config>
	</login-config>
```

Oder war das an deiner Frage vorbei?


----------



## Gumble (12. Apr 2006)

ok du machst den Datenbankzugriff ueber das JDBCRealm. Man kann sich auch sein eigenes LoginModul ableiten und dort die Authentifizierung vornehmen. Oft hat man ja die Tabellen in Objekte gemappt (ORM, z.B. Hibernate), so kann man auf dieser Ebene arbeiten. Ist auch sinnvoll dann auch konsequent auf direkte DB-Queries zu verzichten.


----------

