Tomcat Login Mechanismus

@ Makus

> die Rollen ja von Webapp zu Webapp unterscheiden können)

Wenn man es "richtig" macht hat jede webapp einen eigenen WEB-INF Ordner. Die Rollen für die jeweilige webseite können sich also unterscheiden.

Mit LDAP habe ich mich bis jetzt nicht beschäftigt. Sorry

esion


.
 
@Andron

ich knabber immer noch an einer Lösung.
Hast Du es hinbekommen, kennst Du ein workaround?

Bitte lass es mich wissen.

Grüsse esion

.
 
@esion

Jede meiner Apps hat ein eigenes WEB-INF Verzeichnis... Das ist auch nicht mein Problem.

Mein Problem ist viel mehr, dass ich ein Mapping zwischen LDAP-Inhalten und Webapp-Rollen benötige... Und dieses Mapping möchte ich für jede Webapp separat in deren web.xml machen.

Bsp:
- Rolle "Antragsteller" setzt sich aus allen Usern mit Gruppe "IT" && Country "DE" zusammen. Ausgeschlossen ist aber der User cn=gustl
- Rolle "Genehmiger" setzt sich aus den Usern mit cn=hansi, cn=fritzi und cn=horsti zusammen.
...

In meiner Webapp (JSF/MyFaces) möchte ich dann nur noch sagen:

Code:
<h:commandButton action="..."
                 value="genehmigen"
                 rendered="#{securityContext.ifGranted['Genehmiger']}" />

In meiner aktuellen Konfiguration würde ich es so zum Laufen bekommen:

Code:
<h:commandButton action="..."
                 value="genehmigen"
                 rendered="#{securityContext.ifAnyGranted['hansi','fritzi','horsti']}" />

Da ich aber an vielen Stellen Rollenabfragen habe, müsste ich überall die Benutzer auflisten, was inakzeptabel ist. Außerdem kann ich nur auf LDAP-Usernamen und LDAP-Gruppen zugreifen. Ich könnte z.B. keine Abfrage auf die LDAP-Location machen...

Hat jmd noch eine Idee?

Gruß
Markus


PS: Ich vermute dass das ganze darauf hinausläuft, dass ich mir eine eigene Realm-Klasse schreiben muss :(
 
Zuletzt bearbeitet:
Hi Markus habe leider noch nicht ganz verstanden.


Algemeine Frage: Wie viele Rollen hast Du im insgesamt und wie oft ändern sie sich?

Grundsätzlich: Wenn es zu viele Rollen werden halte ich es für
ungeschickt wenn sie Statisch in der web.xml liegen bzw es kein
UI gibt mit der sie geändert werden können.





Habe ich dich richtig verstanden? Mir sind die Enditäten nicht ganz klar.


IT | DE -> antragsteller access
Admin | DE -> antragsteller access
gusti | DE -> antragsteller denied

Quelle web.xml? - Rolle "Antragsteller" setzt sich aus allen Usern mit Gruppe "IT"
&& Country "DE" zusammen. Ausgeschlossen ist aber der User cn=gustl

gustel gehört weder zu antragsteller & genehmiger?


IT DE | hansi -> genehmiger denied
IT DE | frizi -> genehmiger denied
IT DE | horsti -> genehmiger denied
Quelle LDAP? - Rolle "Genehmiger" setzt sich aus den Usern mit cn=hansi, cn=fritzi und cn=horsti zusammen.

Sind alle Genemiger auch Antragsteller? (Teilmenge von Antragsteller)





'hansi','fritzi','horsti','markus','esion'

Die hier haben die sich doch schon angemeldet bevor sie auf die

Genemiger funktion zugreifen dürfen oder ?

Was ist bereits bekannt bevor der commandButton gerändert/nicht gerändert werden soll.

Der Name und dessen (Antragsteller)Rolle von zb hansi ist doch dann bekannt.

Kannst Du nicht vor die Genemiger Seite eine zweite realm Abfrage schalten

ob er auch zur Guppe Genehmiger gehört?


Und jetzt das eigendliche Problem Du kannst von dem XML realm nicht auf

LDAP schalten. Hast du schon versucht zwei Realms in der server.xml Einzutragen?

Was passiert dann?




Falls Dir die methoden zum abfragen von des aktuellen authentifizierete users nicht bekannt sein sollten.

javax.faces.contex

isUserInRole() //liefert true wenn die aktuelle authentifizierete Benutzer entsprechende rolle hat
getRemoteUser() //liefert den Name
getUSerPrincipal() // liefert java.security.Principal-Objekt.



zb methode

public boolean isUserInThisRole(String genehmiger){
ExternalContext ec = FacesContext.getCorrentInstance().getExternalContext();
return ec.isUserInRole(genehmiger);
}


Das Tomahawk Packet kennt noch visibleOnUserRol, enabledOnUserRole.


Grüsse esion



PS da kann noch der ein und der andere Tippfehler enthalten sein bin ein REALM und JSF .
 
Hi esion,

erstmal vielen Dank für Deine Hilfe :)

Algemeine Frage: Wie viele Rollen hast Du im insgesamt und wie oft ändern sie sich?

Es sind nur etwa 5 Rollen die sich selten ändern.

Habe ich dich richtig verstanden? Mir sind die Enditäten nicht ganz klar.

IT | DE -> antragsteller access
Admin | DE -> antragsteller access
gusti | DE -> antragsteller denied
Quelle web.xml?
...
IT DE | hansi -> genehmiger denied
IT DE | frizi -> genehmiger denied
IT DE | horsti -> genehmiger denied
Quelle LDAP?

Das war zwar nur ein Beispiel, aber genau so habe ich mir das etwa vorgestellt.

Die Quelle für den linken Teil (vor dem Pfeil) sollte LDAP sein und via web.xml auf den Rollennamen (rechts) gemappt werden, z.B.

Code:
<role name="genehmiger" rule="|(cn=hansi)(cn=fritzi)(cn=horsti)" />

Sind alle Genemiger auch Antragsteller? (Teilmenge von Antragsteller)

Genau hier liegt mein zweites Problem (noch nicht angesprochen): ALLE User sollen Antragsteller sein. Theoretisch bräuchte ich für diese Rolle also keine Authentifizierung. Aber da ich den Benutzernamen brauche um ihn in einer DB zu hinterlegen, muss sich der User doch einloggen...

'hansi','fritzi','horsti','markus','esion'
Die hier haben die sich doch schon angemeldet bevor sie auf die
Genemiger funktion zugreifen dürfen oder ?

Was ist bereits bekannt bevor der commandButton gerändert/nicht gerändert werden soll.

Der Name und dessen (Antragsteller)Rolle von zb hansi ist doch dann bekannt.

Kannst Du nicht vor die Genemiger Seite eine zweite realm Abfrage schalten ob er auch zur Guppe Genehmiger gehört?

Nach dem Einloggen ist mir nur der Benutzername bekannt. Woher soll meine Webapp die Rolle "Antragsteller" kennen? Sie kennt nur die LDAP-Rollen, jedoch nicht meine logischen Rollen... Und genau die möchte ich in der web.xml definieren.

Und jetzt das eigendliche Problem Du kannst von dem XML realm nicht auf
LDAP schalten. Hast du schon versucht zwei Realms in der server.xml Einzutragen?
Was passiert dann?

Das wäre noch eine Überlegung wert... Werde ich evtl. nächste Woche mal ausprobieren. thx für den Tipp :)

Das Tomahawk Packet kennt noch visibleOnUserRol, enabledOnUserRole.

Du sagst es... es kennt noch diese beiden Attribute. Werden aber wohl in den nächsten Versionen deprecated (da jede UI-Komponente um diese Attribute erweitert werden musste - diese Erweiterung wird beim securityContext umgangen). Der SecurityContext funktioniert bei mir auch wunderbar - aber eben nur mit LDAP-Usern und -Gruppen - nicht mit meinen logischen Webapp-Rollen, da nicht gemappt.


Gruß
Markus
 
@Andron

ich knabber immer noch an einer Lösung.
Hast Du es hinbekommen, kennst Du ein workaround?

Bitte lass es mich wissen.

Grüsse esion

.


Nur zum Teil und für Testzwecke. Habe meine App noch nicht fertig entwickelt, dauert noch.
Ich habe keine login.jsp, der User ruft die Seite http://www.meineseite.de/MyServlet auf. Nachdem er sich angemeldet hat, kommt er in das Servlet und wird von da aus weitergeleitet.
Mein Problem ist, wenn der User das eingibt: http://www.meineseite.de/NochEinServlet, dann wird er nach dem Einloggen auch auf die Seite weitergeleitet und das brauche ich nicht.
 
Hehe

habs just im Moment grade noch so hinbekommen
- war eine schwere Geburt und hat mich echt ausgebremst..



Zur Lösung:
Man muss einfach wissen - Das Login darf nicht direkt aufgerufen werden.


Erstell eine Index Datei.
Die Index Datei ist eigentlich nichts weiter als eine Weiterleitung,
auf eine bestimmte zu schützende Datei.

Was passiert?
Tomcat bekommt einen request aus der Index auf die zu schützende
Datei und fragt seinen Sicherheitsmechanismus ab. Dabei merkt sich Tomcat
was angefordert wurde. Sagt sich aber "nee" nicht ohne Rolle, leitet weiter auf die login
Seite die in der web.xml festgelegt ist.

Die Login Seite ist so zu gestalten als ob es der Standard Einstieg für
den Internetauftritt ist.

Der User meldet sich an hat jetzt seine Rolle, und da sich
Tomcat den request gemerkt hat (Die Weiterleitung aus der Index)
wird der request zurückgegeben.

Andernfalls, wenn die Anmeldung fehlgeschlagen gibt Tomcat,
die in der web.xml festgelegten error Seite zurück.

Phuu, so nach dem der User jetzt seine Rolle hat, kann diese abgefragt
und eine entsprechende Navigation via JSF gerändern werden.

Lange rede kurzer Sinn.
Der Trick an der ganzen Geschichte ist das es keinen Link
gibt auf den gecklickt wird sondern ein automatischen request
auf einen geschützen Bereich gibt.



Grüsse esion

PS Eine Weiterleitung auf der ersten Seite ist ganz schlecht für das Ranking
bei Suchmaschinen. Also eigendlich auch nicht so toll. Ich habe aber keine
Idee wie es sonst Realmisiert werden soll.


.
 
Hallo zusammen,

ich habe jetzt tatsächlich angefangen, meinen eigenen Realm (abgeleitet von JNDIRealm) zu implementieren. Das ganze funktioniert soweit auch ganz gut - nur ein Problem habe ich noch: Wie bekomme ich innerhalb des Realms den Pfad der aktuellen Webapp heraus? (Request, ServletContext,...)

Hintergrund: Über den JNDIRealm hole ich mir vom LDAP-Server die Gruppen des Benutzers. Diese sollen dann über ein XML-File in logische, applikations-spezifische Rollen gemappt werden. Dieses XML-File möchte ich im WEB-INF Verzeichnis der jeweiligen Webapp ablegen.

Hat jmd eine Idee, wie ich an den WEB-INF-Pfad (oder an die Request-Infos) komme?

Vielen Dank schonmal im Voraus!

Grüße
Markus
 
PHP:
<%
String s=(String)request.getRequestURI();
s=s.substring(0,s.lastIndexOf("/")+1);

	
//out.print(((String)request.getRequestURI()).substring(0,((String)request.getRequestURI()).lastIndexOf("/")));
%>
<%=s %>
<br>(String)request.getRequestURI().substring(0,(((String)request.getRequestURI()).lastIndexOf("/"))+1) #

#<%= (String)request.getRequestURI().substring(0,(((String)request.getRequestURI()).lastIndexOf("/"))+1) %><br>
<table border="1">
<%
int i=0; 
out.print("<tr ><td colspan=\"3\" bgcolor=\"cccccc\">Path</td></tr>");
out.print("\n\t <tr colspan=\"1\"><td bgcolor=\"#cccccc\">RealPath			</td><td colspan=\"2\">"+getServletConfig().getServletContext().getRealPath( "/" )+" </td></tr>");
out.print("\n\t <tr colspan=\"1\"><td bgcolor=\"#cccccc\">URI				</td><td colspan=\"2\">"+getServletConfig().getServletContext().getRealPath( request.getRequestURI() ) +"</td></tr>");
out.print("\n\t <tr colspan=\"1\"><td bgcolor=\"#cccccc\">pathInfo 			</td><td colspan=\"2\">"+request.getPathInfo()+" </td></tr>");
out.print("\n\t <tr colspan=\"1\"><td bgcolor=\"#cccccc\">local adress		</td><td colspan=\"2\">"+request.getLocalAddr()+" </td></tr>");
out.print("\n\t <tr colspan=\"1\"><td bgcolor=\"#cccccc\">getPathTranslated</td><td colspan=\"2\">"+request.getPathTranslated()+" </td></tr>");
out.print("\n\t <tr colspan=\"1\"><td bgcolor=\"#cccccc\">getServletPath()</td><td colspan=\"2\">"+request.getServletPath() +" </td></tr>");
out.print("<tr ><td colspan=\"3\" bgcolor=\"cccccc\">&nbsp;</td></tr>");


out.print("<tr ><td colspan=\"3\" bgcolor=\"cccccc\">Verchiedenes</td></tr>");
out.print("\n\t <tr colspan=\"1\"><td bgcolor=\"#cccccc\">Content Type</td><td colspan=\"2\">"+ request.getContentType() +" </td></tr>");
out.print("\n\t <tr colspan=\"1\"><td bgcolor=\"#cccccc\">Query String</td><td colspan=\"2\">"+request.getQueryString()+" </td></tr>");
out.print("\n\t <tr colspan=\"1\"><td bgcolor=\"#cccccc\">getLocal</td><td colspan=\"2\">"+request.getLocale()+" </td></tr>");
out.print("<tr ><td colspan=\"3\" bgcolor=\"cccccc\">&nbsp;</td></tr>");


out.print("<tr ><td colspan=\"3\" bgcolor=\"cccccc\">Request Parameter wenn Form nicht encrypt Multitype</td></tr>");
	Enumeration requestNames=request.getParameterNames() ;
	while(requestNames.hasMoreElements()) {
			i++;
	        String requestName=(String) requestNames.nextElement();
	        String requestValue=(String) request.getParameter(requestName);	        
	       out.print("\n <tr colspan=\"1\"><td bgcolor=\"#cccccc\">Nr:"+i+"</td><td>"+requestName+"</td><td>"+requestValue+"</td></tr>");
	   }
i=0;	
out.print("<tr ><td colspan=\"3\" bgcolor=\"cccccc\">&nbsp;</td></tr>");	

out.print("<tr ><td colspan=\"3\" bgcolor=\"cccccc\">Header Names</td></tr>");
		Enumeration enumHeaderNames=request.getHeaderNames() ;
		while(enumHeaderNames.hasMoreElements()) {
			i++;
			String headerName=(String)enumHeaderNames.nextElement();
		       out.print("\n <tr colspan=\"1\"><td bgcolor=\"#cccccc\">Nr:"+i+"</td><td>headerName "+headerName+"</td><td>Init "+request.getHeader(headerName)+"</td></tr>");										
		}
i=0;
		out.print("\n <tr ><td colspan=\"3\" bgcolor=\"cccccc\">&nbsp;</td></tr>");		
		out.print("\n <tr><td colspan=\"2\">getCharacterEncoding()</td><td> "	+request.getCharacterEncoding()+"</td></tr>");					
		out.print("\n <tr><td colspan=\"2\">getContentLength()</td><td> "		+request.getContentLength() +"</td></tr>");					
		out.print("\n <tr><td colspan=\"2\">request.getContentType()</td><td> "			+request.getContentType()  +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">getLocalAddr()</td><td> "			+request.getLocalAddr()   +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.getLocalName()</td><td> "	+request.getLocalName()   +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.getLocalPort() )</td><td> "	+request.getLocalPort()    +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.getProtocol()  </td><td> "	+request.getProtocol()    +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.getRemoteAddr()</td><td> "	+request.getRemoteAddr()    +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.getRemoteHost()</td><td> "	+request.getRemoteHost()     +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.getRemotePort()  </td><td> "+request.getRemotePort()      +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.getScheme()</td><td> "		+request.getScheme()       +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.getServerName()</td><td> "	+request.getServerName()        +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.getServerPort()</td><td> "	+request.getServerPort()        +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.getRequestURI()</td><td> "	+request.getRequestURI()       +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.isSecure()</td><td> "		+request.isSecure()+"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.getAuthType()</td><td> "	+request.getAuthType()        +"</td></tr>");
		
		out.print("\n <tr><td colspan=\"2\">htttpServletRequest.request.getContextPath() </td><td> "+request.getContextPath()         +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">+request.getMethod()    </td><td> "						+request.getMethod()         +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.getPathInfo()</td><td> "						+request.getPathInfo()+"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.getPathTranslated()</td><td> "					+request.getPathTranslated() +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.getQueryString()</td><td> "						+request.getQueryString()  +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.getRemoteUser()</td><td> "						+request.getRemoteUser()  +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">+request.getRequestedSessionId()</td><td> "				+request.getRequestedSessionId()  +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.getServletPath()()</td><td> "					+request.getRequestURI()   +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">getCharacterEncoding()</td><td> "						+request.getCharacterEncoding()   +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">getServletPath()</td><td> "								+request.getServletPath()   +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">request.getRequestURL()</td><td> "						+request.getRequestURL()    +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">getServletConfig().getServletContext().getServerInfo()</td><td> "	+  getServletConfig().getServletContext().getServerInfo()   +"</td></tr>");
		out.print("\n <tr><td colspan=\"2\">getServletConfig().getServletContext().getServletContextName()</td><td> "+  getServletConfig().getServletContext().getServletContextName()+"</td></tr>");		
		out.print("\n <tr><td colspan=\"2\">getServletConfig().getServletContext().getRealPath(request.getRequestURI()) </td><td> "+  getServletConfig().getServletContext().getRealPath(request.getRequestURI())       +"</td></tr>");		 
    	out.print("\n<tr><td colspan=\"2\">void removeAttribute(String name) </td><td>void</td></tr>");
		out.print("\n<tr><td colspan=\"2\">setCharacterEncoding(String env) </td><td>void</td></tr>");
out.print("<tr ><td colspan=\"3\" bgcolor=\"cccccc\">&nbsp;</td></tr>");	
 
out.print("<tr ><td colspan=\"3\" bgcolor=\"cccccc\">Init Session Attribute</td></tr>");	
	String paraName;	
	Enumeration enumInitPar=getInitParameterNames();
	
	while(enumInitPar.hasMoreElements()) {
		paraName=(String) enumInitPar.nextElement();
		String paraVal =(String) getInitParameter(paraName) ;
		String intitParaVal=(String) getInitParameter(paraName) ;
		out.print("\n<tr><td><br>Name "+paraName+"</td><td>Init "+intitParaVal+"</td><td>Val "+paraVal+"</td></tr>");
	}
	out.print("\n<tr><td colspan=\"3\"><br>Servlet Name:"+getServletName() +"</td></tr>");

	ServletContext servContx=getServletContext();
	//String ServletContextPath=servContx.getMimeType() ;

	
	
	%>
	<tr><td colspan="3">Session</td></tr>
	<%
	/*
	int sessionFeldzaheler=0;
	out.print("<tr colspan=\"3\" bgcolor=\"#aaaaaa\">getParameterNames()</td></td></tr>");
	Enumeration attributeNames2=session.getAttributeNames();
	while(attributeNames2.hasMoreElements()) {
	        String attributeName=(String) attributeNames2.nextElement();
	        String attributeValue=(String)session.getAttribute(attributeName);
	        sessionFeldzaheler ++;
	       out.print("\n<tr><td colspan=\"2\">"+attributeName+"</td><td>"+attributeValue+"</td></tr>");
	   }
	*/
%>
</table>
<br>request.getLocalAddr(): <%= request.getLocalAddr()%>
<br>request.getLocalName(): <%= request.getLocalName()%>
<br>request.getRemoteAddr(): <%= request.getRemoteAddr()%>
<br><%=request.getRequestURI() %>
</body>
</html>
 
Zurück