JAAS mit Tomcat j_security_check Weiterleitung

Herzog77

Grünschnabel
Hallo,
Ich hoffe mir kann hier jemand helfen, da ich zur Zeit nicht mehr weiterkomme... :confused:

Mein Ziel ist über ein LoginModule in Kombination mit einem JAASRealm user für den Zugriff auf eine Webapplikation(JSP) zu authentifizieren.
Als Entwicklungsumgebung benutzte ich Eclipse 3.0 in Kombination mit Tomcat 5.0.30

Ich kann über den local Host bereits auf die Seiten der Webapp zugreifen und die Authentifizierung an sich funktioniert grundsätzlich auch. (User sind in DB vorhanden und ich kann mich über ein Startupservlet direkt authentifizieren.)

Das Login über die Oberfläche der Webapp an sich funktioniert jedoch leider nicht.
Der Ablauf ist dabei wie folgt vorgesehen:

Nach Aufruf der index.jsp soll sich ein user als customer oder admin einloggen können, indem er entweder einen Link für customer oder den Link für admin betätigt.

(Diese Links würden ohne den Einsatz des Login Modules bzw. eines Filters direkt zu der entsprechenden Seite führen.)

Da aber in der web.xml Security constraints festgelegt sind, muss der User sich erst über eine Loginform identifizieren.

Diese Loginform dient als Eingabe zur Ausführung der "j_security_check" action welche die Identifizierung übernimmt und anschliessend an die ursprünglich angefragte Seite weiterleiten soll bei erfolgreicher Identifizierung.

Mein Problem ist nun, dass ich nach Betätigung des links und Eingabe der gültigen Daten in das Form nicht mehr auf die ursprünglich angeforderte Seite weitergeleitet werde. (Wenn ich die security constraints auskommentiere klappt dieses).
Da die "j_security_check action" ja standardmäßig definiert ist hab ich keine Idee wie mein Einfluß auf die Weiterleitung zur richtigen Seite nehmen kann. Das Mapping gemaess Web.xml besteht ja bereits in richtiger Form, sonst würde es ohne Security constraints ja auch nicht hinhauen....?

Nachfolgender der relevante Code:

WEB.XML

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>jaas-book</display-name>
<description>JAAS Book, Chapter 9</description>

<filter>
<filter-name>authentication-filter</filter-name>
<filter-class>model.AuthenticationFilter</filter-class>

<init-param>
<param-name>app-name</param-name>
<param-value>chp09</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>authentication-filter</filter-name>
<url-pattern>/j_security_check</url-pattern>
</filter-mapping>

<servlet>
<servlet-name>InitServlet</servlet-name>
<servlet-class>controller.StartupServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>

<servlet>
<servlet-name>Login</servlet-name>
<jsp-file>/view/login.jsp</jsp-file>
</servlet>

<servlet>
<servlet-name>Customer</servlet-name>
<jsp-file>/view/customer/index.jsp</jsp-file>
</servlet>

<servlet>
<servlet-name>Admin</servlet-name>
<jsp-file>/view/admin/index.jsp</jsp-file>
</servlet>

<servlet>
<servlet-name>Index</servlet-name>
<jsp-file>/view/index.jsp</jsp-file>
</servlet>

<servlet>
<servlet-name>Logout</servlet-name>
<jsp-file>/view/logout.jsp</jsp-file>
</servlet>

<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

<init-param>
<param-name>application</param-name>
<param-value>ApplicationResources</param-value>
</init-param>

<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>

<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>

<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>

<init-param>
<param-name>validate</param-name>
<param-value>true</param-value>
</init-param>

<load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>Login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>Customer</servlet-name>
<url-pattern>/customer</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>Admin</servlet-name>
<url-pattern>/admin</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>Logout</servlet-name>
<url-pattern>/logout</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>Index</servlet-name>
<url-pattern>/index</url-pattern>
</servlet-mapping>

<welcome-file-list>
<welcome-file>/view/index.jsp</welcome-file>
</welcome-file-list>

<error-page>
<error-code>403</error-code>
<location>/access-denied.jsp</location>
</error-page>

<taglib>
<taglib-uri>auth-tags</taglib-uri>
<taglib-location>/WEB-INF/tlds/auth-tags.tld</taglib-location>
</taglib>

<security-constraint>
<web-resource-collection>
<web-resource-name>Admin Page (Chp09)</web-resource-name>
<url-pattern>/admin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>

<security-constraint>
<web-resource-collection>
<web-resource-name>Customer Page (Chp09)</web-resource-name>
<url-pattern>/customer/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>customer</role-name>
</auth-constraint>
</security-constraint>

<login-config>
<auth-method>FORM</auth-method>
<realm-name>chp09 Realm</realm-name>
<form-login-config>
<form-login-page>/view/login.jsp</form-login-page>
<form-error-page>/view/login-error.jsp</form-error-page>
</form-login-config>
</login-config>

<security-role>
<description>
Role required to see admin pages.
</description>
<role-name>admin</role-name>
</security-role>

<security-role>
<description>
Role required to see customer pages.
</description>
<role-name>customer</role-name>
</security-role>

</web-app>


JAASREALM:

<Realm className="org.apache.catalina.realm.JAASRealm"
appName="chp09"
userClassNames="model.UserPrincipal"
roleClassNames="model.UserGroupPrincipal"
useContextClassLoader="false"/>
</Context>



INDEX.JSP:

<%@ taglib uri="auth-tags" prefix="auth" %>
<html>
<head><title>Index</title></head>
<body>

<a href="admin">Admin Page</a> |
<a href="customer">Customer Page</a> |
<a href="logout">Logout</a>

<auth:roles roles="customer">
<p>Only the <b>customer</b> role sees this.</p>
</auth:roles>

<auth:roles roles="admin,superadmin">
<p>Only the <b>admin</b> role sees this.</p>
</auth:roles>

<p>Principals: <%= request.getUserPrincipal() %>.</p>

</body>
</html>



LOGIN.JSP (FORM)



<html>
<head><title>Login</title></head>
<link rel="stylesheet" href="<%= request.getContextPath() %>/style.css"/>
<body>

<form method="POST" action="<%= request.getContextPath() %>/j_security_check">
<p>Username: <input type="text" name="j_username"/></p>
<p>Password: <input type="password" name="j_password"/></p>
<input type="submit" value="Login"/>
</form>

</body>
</html>
 
Danke für die schnelle Antwort und den Link, das Beispiel hatte ich allerdings bereits gesehen, es konnte mir leider nicht weiterhelfen.

Die grundlegende Technik ist zwar die gleiche, allderdings möchte ich mich mit Hilfe des JAAS Realms kombiniert mit einem Login Modul authentifizieren, was ein wenig komplexer ist und wo genau mein Problem liegt.

D.h. ich will das JAAS framework zur Authentication & Authorization nutzten. Dazu lese ich die Subjecte bzw. principals aus einer Datenbank als Quelle ein, gegen die dann die Authentifizierung über das Login Modul stattfinden soll.

Nachdem die Loggin Form aufgerufen wurde und die richtige Benutzerkennung und das richtige Password eingegeben wurde, wird die action "j_security check" aufgerufen und dann hängt sich das Programm leider auf, anstatt mich an die gewünschte Seite weiterzuleiten.

Wenn ich eine falsche Kennung bzw. Pwd eingeben funktioniert es ordnungsgemaess, d.h. ich werde zu error Seite geleitet und bekomme die folgende Exception: "javax.security.auth.login.LoginException: Anmeldefehler: Alle Module werden ignoriert"

Ich werde aber bei ordnungsgemaesser Eingabe nicht weitergeleitet. (Wenn ich die Url der gewünschten Seite nachträglich in den Browser eingebe erhalte ich die Seite als authentifizierter User)

Ich habe jetzt auf der Tomcat Seite gelesen dass dieses typischerweise der Fall ist, wenn das login Module kein user object erstellt und keine exception wirft.
Allerdings sollte es genau dieses tun.:mad:

Nachfolgend zusätzlich der Code meines LOGIN MODULES und nochmals der Code des JAAS Realms.

Ich habe die Befürchtung dass die im Realm angegebenen Klassen (model.UserPrincipal & model.UserGroupPrincipal) von Tomcat nicht gefunden werden, (!) kann aber nicht verstehen wieso, da diese im entsprechendem Folder meiner Webapp abgelegt sind.


package model;

import javax.security.auth.login.LoginException;

public class TomcatLoginModule
extends DbLoginModule {

public boolean commit() throws LoginException {
if (super.commit()) {
UserPrincipal userP = new UserPrincipal(getUsername());
System.out.println("UserPrincipal userP = new UserPrincipal(getUsername()); :" +
getUsername());
getSubject().getPrincipals().add(userP);
return true;
} else {
return false;
}
}
}

JAASREALM:

<Realm className="org.apache.catalina.realm.JAASRealm"
appName="chp09"
userClassNames="model.UserPrincipal"
roleClassNames="model.UserGroupPrincipal"
useContextClassLoader="false"/>
</Context>
 
vielleicht habe ich ein wenig zu weit ausgeholt, mittlerweile kann ich das Problem aber ein wenig eingrenzen... beim Ausführen der Webapp über Tomcat bekomme ich mittlerweile die java.lang.SecurityException: Anmeldekonfiguration kann nicht gefunden werden. at com.sun.security.auth.login.ConfigFile.<init>(ConfigFile.java:97)

Ich hatte eigentlich gedacht, dass man wenn man einen JAASREALM festlegt und die abzugleichenden Authentifizierungsdaten aus der DB einliest keinen "configuration file" braucht ?
Diese Fehlermeldung erhalte ich seitdem ich in Eclipse in den Tomcat Preferences das Häckchen bei Tomcat mit einem Security Manager starten aktiviert habe.
Zuvor erhielt ich die Fehlermeldung:

The requested resource (/Projectname/j_security_check) is not available.

P.S. ich hatte mir jetzt auch nochmal das Beispiel "Tomcat Login Mechanism" vorgenommen und bei diesem musste ich feststellen, dass ich gar nicht zur Log in Seite gelange, sondern direkt zur index.html. Auf welcher/n Tomcatversion basiert dieses eigentlich...? Hab das Gefühl das mit meinem Tomcat Setup was nicht stimmt.

Da ich mich noch nicht solange mit Authentifizierung / Security und Jaas beschäftige, wäre es wirklich sehr wichtig für mich, wenn jemand zu meinen Problem etwas einfallen würde....
 
falls es noch jemanden interessiert.

der besagte Fehler:

java.lang.SecurityException: Anmeldekonfiguration kann nicht gefunden werden.at com.sun.security.auth.login.ConfigFile.<init>(ConfigFile.java:97)
lag im übrigen daran, dass ich in dem maßgebendem policy file, bei mir unter:
c:\jakarta-tomcat-5.0.30\conf\catalina.policy
die Zugriffsrechte nicht vergeben hatte.

Nachdem ich die folgenden Rechte in der grant Klausel hinzugefügt hatte funktioniert es...

permission javax.security.auth.AuthPermission "doAsPrivileged";
permission javax.security.auth.AuthPermission "getLoginConfiguration";
permission javax.security.auth.AuthPermission "setLoginConfiguration";
permission java.util.PropertyPermission "java.security.auth.login.config","read,write";
 
Zurück