Parameterübergabe mit j_security_check / Rollenbasierte Anzeige

silmepurpurdrache

Grünschnabel
Hallo zusammen,

Ich such mir schon nen Wolf, finde aber nichts zu meiner Frage.

Also, die Situation ist, ich habe eine Abfrage von j_security_check (die Daten kommen aus einer MySQL-DB), funktioniert auch alles ganz prima. Ich habe zwei Rollen, student und pruefer.

In der login.jsp gibt es diesen j_security_check, der dann auf die index.jsp verweist. Auf der index.jsp möchte ich dann allerdings, je nach Rolle des Benutzers, etwas anderes anzeigen lassen (das sind jeweils Links, die auf verschiedene Seiten verweisen).

Ich bräuchte also einen Mechanismus, der eins der folgenden Anforderungen erfüllt:

a) Die Möglichkeit, den j_username irgendwie auf die index.jsp zu übertragen - aber ich fürchte, das geht nicht so einfach, weil jegliche Parameter in meiner Webanwendung versteckt sind. Egal was ich mache, nichts kommt an... (Bsp.: session.setAttribute(...)). Ich weiß nicht obs an j_security_check liegt oder daran dass ich zu doof bin für sowas, bin noch relativ neu im Thema... Hier das, was ich beispielsweise in der login.jsp ausprobiert hatte:
Code:
<FORM METHOD=POST ACTION=j_security_check>
<table>
<tr>
<td>
Benutzername:</td><td>
<input type="text" name="j_username" value="" size=20 maxlength=50></td>
<%
String lstrName = (String) request.getParameter("j_username");
session.setAttribute("name", lstrName);
%>
</tr><tr><td>Passwort:</td><td>
<input type="password" name="j_password" value="" size=20 maxlength=50></td></tr><tr><td>
<input type="submit" value="login"/></td></tr>
</table>
</form>

b) Die Möglichkeit, direkt Rollen auszulesen, denn j_security_check ist ja eigentlich auch rollenbasiert. Ich hatte etwas gesehen im Internet, dass man die jeweiligen rollenbasierten Seiten in eigene Verzeichnisse steckt, würde das aber gerne vermeiden, weil das beim Ausprobieren auch nicht wirklich geklappt hat, und wenn es doch keine andere Möglichkeit gibt, würde ich gerne wissen wie das nun wirklich geht und wie man die Rollen abfragt und so.

Hier nochmal die Details, was ich verwende:

- MySQL 5.1 Datenbank
- Tomcat6
- Eclipse Galileo
- JRE 6
 
Hallo Tom,

Den Link kannte ich schon, danke. Der Java-Code wird mir aber sicherlich helfen! Ich werde das mal ausprobieren, dankeschön! :)
 
Soooo...

Die Weiterleitung auf die übergeordneten Ordner /student und /pruefer funktioniert nun prima. Allerdings habe ich scheinbar immer noch einen Denkfehler. Und zwar habe ich eine Anzahl JSPs in diesen Ordnern, und ich möchte gerne eine "Ausloggen"-Funktion einfügen, in etwa so:

HTML:
<a href="logout.jsp">Ausloggen</a>

Die logout.jsp soll allerdings nur einmal vorkommen, und zwar im WebContent-Ordner, also im Root-Ordner, dort wo auch die index.jsp und die login.jsp liegt, nicht in den Ordnern /pruefer oder /student. Das geht aber nicht, da er mit dem obigen Codebeispiel das als /pruefer/logout.jsp (Beispiel) interpretiert, wenn man sich gerade im Prüferverzeichnis befindet. Also habe ich die logout.jsp kopiert und jeweils in die Ordner /pruefer und /student eingefügt. Damit kommt der Security-Check durcheinander, und sobald man sich ausloggt, herrscht Chaos, wenn man sich dann wieder einloggt. Man wird dann nach jedem Seitenwechsel nach dem Passwort gefragt.

Ich habe den Tipp befolgt, überall einen "/" vor den Link zu schreiben, also beispielsweise:

HTML:
<a href="/logout.jsp">Ausloggen</a>

Damit, so laut Tutorial, würde der Browser das immer "richtig" interpretieren. Das hat aber ganz und gar nicht geklappt, dann wird die Seite gar nicht mehr gefunden.

Die Lösung ist sicher total einfach, aber ich bin etwas ratlos und würde mich über jeden Hinweis freuen.

Liebe Grüße
Kerstin
 
Das funktioniert leider auch nicht.

Fehlermeldung:

HTML:
description The requested resource (/logout.jsp) is not available.

Er versucht dann, auf http://localhost/logout.jsp zuzugreifen und nicht wie erwartet auf http://localhost/projektname/logout.jsp. Ändere ich den Code auf

HTML:
<a href="http://www.tutorials.de/forum/projektname/logout.jsp">Ausloggen</a>
muss ich zweimal auf den Link drücken, damit er "ausloggt", also in etwa der gleiche Effekt wie mit "logout.jsp" (also ohne ../ oder /). Würde ich dann versuchen, mich wieder einzuloggen, ist wieder Chaos angesagt (Effekt wie im letzten Posting).

Liebe Grüße
Kerstin
 
Zuletzt bearbeitet:
Hallo,

Ich glaube ich habe gefunden, woran es liegt.

Hier die logout.jsp:

HTML:
 <% 
 session.invalidate();
 request.getRequestDispatcher("index.jsp").forward(request,response);
 %>

Dann die index.jsp, die eigentlich dafür da ist, auf die Unterverzeichnisse weiterzuleiten:

HTML:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Anmeldung</title>
</head>
<body>
<br/>
<% if (request.isUserInRole("student")) {%>
<jsp:forward page='/student/index.jsp'/>
<% } 
else if (request.isUserInRole("pruefer")) {%>
<jsp:forward page='/pruefer/index.jsp'/>
<%} %>

</body>
</html>

Es ist klar, dass er dann durcheinander kommt. Man ist eigentlich nicht mehr eingeloggt, aber die Anwendung versucht trotzdem, Informationen über die Rolle des aktuellen Benutzers herauszufinden, um dann weiterzuleiten.

Jetzt ist die Frage, wie ich weiter vorgehen soll. Ich kann in der logout.jsp nicht auf die login.jsp verweisen (um einen neuen Login zu erzwingen) und auch keine zweite index.jsp erstellen (Bsp. index2.jsp), denn dann müsste ich - meiner bescheidenen Meinung nach - einen neuen j_security_check in der index2.jsp machen, und das ist nicht erlaubt. Eine Idee von mir wäre, in der index.jsp sowas einzufügen wie
HTML:
<% else { 
       // neu einloggen
      login();
%>
Aber man darf nicht auf die login.jsp verweisen wenn ich das richtig verstanden habe. Jemand eine Idee?



-----------------------------------
Okay. In einem anderen Forum steht, man soll in der logout.jsp einfach auf eine Seite in dem gesicherten Bereich, d.h. in einem der Unterverzeichnisse, verweisen. Dann würde man aufgefordert werden, das Passwort neu einzugeben und alles ist prima. Also habe ich folgendes in der logout.jsp gemacht (wie gesagt, ich habe zwei Rollen, also sollte ich das auch berücksichtigen in meinem Code):

HTML:
 <% 
 //session.invalidate();
 String check = "";
 if (request.isUserInRole("pruefer")) {
	 check = "pruefer";
 }
 if (request.isUserInRole("student")) {
	 check = "student";
 }
 request.getSession().invalidate();
 if (check == "pruefer") {
 	request.getRequestDispatcher("/pruefer/index.jsp").forward(request,response);
 }
 else if (check == "student") {
	request.getRequestDispatcher("/student/index.jsp").forward(request,response);
 }
 %>
Derselbe Effekt wie immer, Chaos pur. Man muss zweimal ausloggen, um sich dann nicht mehr ordentlich anmelden zu können. *grml*.

Ich untersuche das noch weiter und halte euch auf dem Laufenden.

--------------------------
Bei näherer Betrachtung geht das natürlich auch nicht. Ich MUSS einfach auf die index.jsp im obersten Verzeichnis, ich möchte ja, dass sich, nachdem ein Prüfer sich ausgeloggt hat, auch mal ein Student einloggen kann. Ich bin langsam mit meinem Latein am Ende (welch Überraschung).
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück