# Login mit Filter (JSP/JSF)



## Dozor (27. Mrz 2008)

Hallo,

nun ich fange erstmal mit dem Grundlegenden an ich habe eine Anwendung für mich geschrieben,
diese ist natürlich in JSP die anschließend auf *.faces von mir konfiguriert wurden.

Faces-config.xml:

```
<navigation-rule>
	<display-name>login</display-name>
	<from-view-id>/login.jsp</from-view-id>
	<navigation-case>
		<to-view-id>/protect/test.jsp</to-view-id>
	</navigation-case>
</navigation-rule>
<navigation-rule>
	<display-name>protect/test</display-name>
	<from-view-id>/protect/test.jsp</from-view-id>
	<navigation-case>
		<to-view-id>/protect/test2.jsp</to-view-id>
	</navigation-case>
</navigation-rule>
```

Die anwendung läuft auf nem Tomcat 6.0.16 unter Windows.

Das dumme alles Funktioniert nur nicht der Login in meinem Sin^^.
beim Login verwende ich den JDBC Realm auf ne Mysql 5 Datenbank.


JDBCRealm:

```
<Realm className="org.apache.catalina.realm.JDBCRealm" 
    driverName="org.gjt.mm.mysql.Driver"
    connectionURL="jdbc:mysql://localhost:3306/testlogin"
    connectionName="root"  connectionPassword=""
    userTable="users" userNameCol="user_name" userCredCol="user_pass"
    userRoleTable="user_roles" roleNameCol="role_name"/>
```

web.xml:

```
<filter>
	<description></description>
	<display-name>UserFilter</display-name>
	<filter-name>UserFilter</filter-name>
	<filter-class>de.test.UserFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>UserFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
<security-constraint>
	<display-name>TestProject</display-name>
	<web-resource-collection>
		<web-resource-name>TestProject</web-resource-name>
		<url-pattern>/protect/*</url-pattern>
		<http-method>GET</http-method>
		<http-method>POST</http-method>
	</web-resource-collection>
	<auth-constraint>
		<description>allgemeine acces role</description>
		<role-name>test001</role-name>
	</auth-constraint>
</security-constraint>
<login-config>
	<auth-method>FORM</auth-method>
	<form-login-config>
		<form-login-page>/login.faces</form-login-page>
		<form-error-page>/loginError.faces</form-error-page>
	</form-login-config>
</login-config>

<security-role>
	<description>allgemeine access role</description>
	<role-name>test001</role-name>
</security-role>
```

index.jsp:

```
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
	<c:redirect url="/protect/test.faces"></c:redirect>
</html>
```

login.jsp:

```
<form action="j_security_check" method="get" name="loginForm">
<table>
	<TBODY>
		<tr>
			<td>UserID:</td>
			<TD><input type="text" name="j_username" size="2" /></TD>
		</tr>
		<tr>
			<td>Password:</td>
			<TD><input type="password" name="j_password" size="20" /></TD>
		</tr>
		<TR>
			<TD>[url="javascript:document.loginForm.submit()"] Login [/url]</TD>
		</TR>
	</TBODY>
</table>
</form>
```


Nun zu meinem eigentlichen Vorgehen.
Bei meinem Login habe ich einen UserFilter eingerichtet der von  javax.servlet.Filter erbt und bei alle Request abfängt.
in der doFilter() Methode hohle ich mir den beim Login eingegebenen User raus


```
public void doFilter(ServletRequest request, ServletResponse response,
	FilterChain filterChain) throws IOException, ServletException {
	String method = "doFilter";
	try {
	    HttpServletRequest httpRequest = ((HttpServletRequest) request);
	    HttpServletResponse httpResponse = ((HttpServletResponse) response);
	    HttpSession session = httpRequest.getSession();

	// get username from the request ...
	    String user = request.getParameter("j_username");
                // if(user.isValid())
                //session.setAttribute("username", user);
                    filterChain.doFilter(request, response);
                      }catch(Throwable e){
                             e.printStackTrace();                                        
                      }
}
```

Nun nach dem Raushohlen des Users würde ich "IHN" in der Session speichern 
damit die restlichen Seiten auf den User abgestimmt sind und "personalisiert".
und hier tritt für mich der erste fehler auf egal aus welcher Url/seite auch immer der user ist immer null:

ausser bei der url von /meinProject/j_security_check da bringt es mir den richtigen user hervor aber 
leider versucht er bei sowas dann direct die seite j_security_check anzusprechen die es natürlich nicht im project gibt
und das wieder rum wirft 404 Error was natürlich nur selbstverständlich ist ...
auf die j_security_check versucht er aber auch nur zu gehen wenn ich die login.faces seite direct anspreche.

Nun meine vermuttung ist einfach das die faces-config nicht richtig greifen und das weiterleiten von login auf eine protect seite nicht greift.
ich weiß da nicht mehr weiter entweder wirft er mir nen 404er beim direckten zugriff oder nen 400

sieht jemand da einen fehler oder baut das nach und versucht mir da weiter zuhelfen.

*Ohne den Filter und ohne das direkte ansprechen der Login seite Funktioniert es und ich komme in den geschützen bereich*


Viele Grüße

Dozor


----------



## freez (28. Mrz 2008)

als DriverClass für mysql sollte, soweit ich mich erinnere com.mysql.jdbc.Driver verwendet werden. Ist aber wahrscheinlich nicht dein Problem.


----------



## freez (28. Mrz 2008)

ich vermute, dein Filter hat diese Informationen gar nicht mehr

versuche mal folgendes:


```
String username = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName();
```

damit hole ich normalerweise den Usernamen.

Übrigens benutze ich es so in meinen Beans, um personalisierte Informationen anzuzeigen. Da brauche ich keinen Filter.


----------



## ms (1. Apr 2008)

Daran haben sich schon einige die Zähne ausgebissen.
Am einfachsten ist es für den Anfang den Security-Teil von der JSF-Applikation komplett zu trennen.
Dh, in deinem Fall direkt auf die login.jsp und loginError.jsp zu verweisen.

```
<login-config>
   <auth-method>FORM</auth-method>
   <form-login-config>
      <form-login-page>/login.jsp</form-login-page>
      <form-error-page>/loginError.jsp</form-error-page>
   </form-login-config>
</login-config>
```

Weiters kannst du dir damit den Filter, die login-Navigationrules und die umständliche Redirectlogik in der index.jsp sparen.

ms


----------

