# MVC: Servletweiterleitung umgeht Login Authentifizierung



## console (3. Dez 2008)

Hallo Allerseits, habe folgendes Problem:

Ich habe ein Controller Servlet was meine UserAnfragen auswertet. In der Web.xml habe ich alle Seiten im Unterordner adressadmin verweigert. Rufe ich nun eine JSP per Direktlink in diesem Unterordner auf, erscheint die Login-Form und ich muss mich authentifizieren. So weit so gut. Übergebe ich den Request jedoch an mein Servlet das mich weiterleiten soll, kommt die Login-Form *nicht* und ich werde direkt durchgeleitet (Cookies vorher gelöscht).

Wie kann ich das Servlet zur Login.jsp zwingen und verhindern dass ich ohne Authentifizierung weitergeleitet werde?

Mein Servlet:


```
protected void doGet(HttpServletRequest req, HttpServletResponse res)
				throws ServletException, IOException
	{
		String choice = "";
		//Das Weiterleitungstarget ist default immer index.jsp
		String target = "index.jsp";
		
		//Die Userwahl wird aus dem request geholt
		choice = req.getParameter("choice");
		
if (choice.equals("profil"))
		{
			target = "adressadmin/myprofil.jsp";
		}

RequestDispatcher dispatcher = req.getRequestDispatcher(target);
		dispatcher.forward(req, res);
```

Meine Web.xml:


```
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  
  <servlet>
    <description>Der Main Controller der Anwendung der die Anfragen auswertet und entsprechend weiterleitet</description>
    <display-name>Controller</display-name>
    <servlet-name>Controller</servlet-name>
    <servlet-class>adresscontroller.Controller</servlet-class>
    
    
  </servlet>
  
  <servlet-mapping>
    <servlet-name>Controller</servlet-name>
    <url-pattern>/Controller</url-pattern>
  </servlet-mapping>
  
  <security-constraint>
	<web-resource-collection>
	  <web-resource-name>myResourceCollection</web-resource-name>
	  <url-pattern>/adressadmin/*</url-pattern>
	  
	  <http-method>DELETE</http-method>
                        <http-method>GET</http-method>
                        <http-method>HEAD</http-method>
                        <http-method>OPTIONS</http-method>
                        <http-method>POST</http-method>
                        <http-method>PUT</http-method>
                        <http-method>TRACE</http-method> 
	  	  
	</web-resource-collection>
	
	<auth-constraint>
	  <role-name>masteruser</role-name>
	  <role-name>normaluser</role-name>
	</auth-constraint>	
  </security-constraint>
  
  <login-config>
    <auth-method>FORM</auth-method>
    <realm-name>Default</realm-name>
    <form-login-config>
      <form-login-page>/login.jsp</form-login-page>
      <form-error-page>/error.jsp</form-error-page>
    </form-login-config>
  </login-config>
```

Was ich nicht möchte ist, dass das Servlet per request.isUserInRole("user") irgendwas programmatisch abprüft. Gibts da irgendeine Einstellung in der web.xml, sodass das Servlet nicht einfach ohne Authentifizierung in einen geschützten Bereich weiterleitet?

Danke im Vorraus...


----------



## gex (3. Dez 2008)

Hallo



> Gibts da irgendeine Einstellung in der web.xml, so dass das Servlet nicht einfach ohne Authentifizierung in einen geschützten Bereich weiterleitet?


Soweit ich weiss nein. Du kannst ja mal das XSD anschauen http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd

Das Problem ist, dass - insofern ich mich jetzt nicht täusche - die security-constraint lediglich bei direkten
requests auf gültige Credentials prüft. Da aber ein forward per RequestDispatcher innerhalb der Applikation
- und nicht via HTTP-Redirect - durchgeführt wird, greift das aneinander vorbei.

Was du aber machen könntest wäre: 
Du schreibst einen Security-Filter, in dem du die Rollenprüfung machst, dann hast du die Security von deinem 
Controller getrennt und du kannst auch die internen Forwards (=DispatcherType) einbeziehen.

Gruss


----------



## Wintersoul (4. Dez 2008)

Hi,

Du könntest eine neue Rolle mit einer Wildcard erstellen (<role-name> * </role-name>). Dann würde jeder User durch den Asterisk erstmal gesondert behandelt werden. 
Um den Zugriff zu geschützten Ressourcen zu verweigern, wird ähnlich vorgegangen.

Vielleicht hilft dir die Dokumentation vom Resin Server weiter: ->Link<-

Gruß


----------

