# SessionAttribut nach j_security_check setzen



## unclesam (20. Apr 2009)

Edit: oh beim durchstöbern habe ich wohl ausversehen das falsche Forum erwischt :/ --> gehört in den WebTier

Hi, habe ein Problem mit meinem Login via "j_security_check" (auf TomCat 6 Server). Derzeit wird der User wenn er nicht eingeloggt ist auf die Login.jsp weitergeleitet, wo er sich mit seiner email und seinem passwort einloggen muss (welche dann über die DB validiert werden).

server.xml
[XML]
<Realm className="org.apache.catalina.realm.JDBCRealm" 
connectionName="postgres" connectionPassword="pw" 
connectionURL="jdbcostgresql://localhost:5432/DBAEProjekt" 
driverName="org.postgresql.Driver" resourceName="UserDatabase" 
roleNameCol="rolle" userCredCol="passwort" userNameCol="email" 
userRoleTable="rolle" userTable="benutzer"/>
[/XML]Nun wird die zuvor requestete URL aufgerufen.
Dies funktioniert soweit einwandfrei, jedoch würde ich gerne nach der erfolgreichen Authentifikation dem Benutzer ein paar SessionAttribute zuweisen.
Hierfür muss ich ja irgendwie den j_security_check abfangen und erweitern. Dies wollte ich über einen Filter realisieren der auf "/j_security_check" gemappt ist realisieren, was allerdings nicht funktioniert. Da wie ich vermute das mapping nie eintrifft. 
Via "/*" mapping würde es wohl theoretisch funktionieren, jedoch geht er dann logischerweise bei jedem Aufruf in diesen Filter, was wie ich denke nicht unbedingt die sauberste und vorallem in bezug auf die laufzeit nicht die freundlichste Lösung ist.

Hat jmd. einen Tipp wie ich dies realisieren könnte ?

Hier noch die wichtigsten Codeschnippsel:

web.xml
[XML]
...
  <security-role>
    <role-name>captain</role-name>
  </security-role>
  <security-role>
    <role-name>benutzer</role-name>
  </security-role>
    <filter>
      <display-name>LoginFilter</display-name>
      <filter-name>LoginFilter</filter-name>
      <filter-class>db.LoginFilter</filter-class>
    </filter>
  <filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/j_security_check</url-pattern>
  </filter-mapping>
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Geschuetzter Bereich</web-resource-name>
      <url-pattern>/Loged/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>captain</role-name>
      <role-name>benutzer</role-name>
    </auth-constraint>
  </security-constraint>
  <login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
      <form-login-page>/Login</form-login-page>
      <form-error-page>/WEB-INF/open/error.jsp</form-error-page>
    </form-login-config>
  </login-config>
  <listener>
    <listener-class>db.DBCPoolingListener</listener-class>
  </listener>
  <resource-ref>
    <description> DB Connection Pooling</description>
    <res-ref-name>jdbc/DBAEProjektDB</res-ref-name>
    <res-type> javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
  <servlet>
    <description></description>
    <display-name>Regis</display-name>
    <servlet-name>Regis</servlet-name>
    <servlet-class>benutzer.Regis</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Regis</servlet-name>
    <url-pattern>/Regis</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>Profil</display-name>
    <servlet-name>Profil</servlet-name>
    <servlet-class>benutzer.Profil</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Profil</servlet-name>
    <url-pattern>/Loged/Profil</url-pattern>
    <url-pattern>/Loged/Profil/*</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>logout</display-name>
    <servlet-name>logout</servlet-name>
    <jsp-file>/WEB-INF/pages/logout.jsp</jsp-file>
  </servlet>
  <servlet-mapping>
    <servlet-name>logout</servlet-name>
    <url-pattern>/Logout</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>login</display-name>
    <servlet-name>login</servlet-name>
    <jsp-file>/WEB-INF/open/login.jsp</jsp-file>
  </servlet>
  <servlet-mapping>
    <servlet-name>login</servlet-name>
    <url-pattern>/Login</url-pattern>
  </servlet-mapping>
...
[/XML]Login.jsp

```
<div id="navi\">");
    <form action="j_security_check" id="login" method="POST">
        E-Mail:<input type="text" name="j_username"/><br />
        Passwort:<input type="password" name="j_password"/><br />
    <input type="submit" value="Login"/>
    </form>
</div>
```
db.LoginFilter.java

```
public class LoginFilter implements Filter {
    protected FilterConfig filterConfig = null;
    public void destroy() {
       filterConfig.getServletContext()
          .log(":: PostLoginFilter - destroy");
       filterConfig = null;
    }
 
    public void doFilter(ServletRequest req, ServletResponse resp,
             FilterChain chain) throws ServletException, IOException {
            
       filterConfig.getServletContext().log(":: PostLoginFilter - doFilter");
       System.out.println("vor j_security_check");
       chain.doFilter(req, resp);
       System.out.println("nach j_security_check");
    }
 
    public void init(FilterConfig config) throws ServletException {
       filterConfig = config;
       filterConfig.getServletContext().log(":: PostLoginFilter - init");
    }
}
```
Vielen Dank schon im voraus 

unclesam


----------



## maki (21. Apr 2009)

Wirst wohl nicht die JAAS Authentitfizierung umbiegen können, einen Session/Login Filter zu haben ist nicht unüblich.


----------



## unclesam (21. Apr 2009)

also das Filter-mapping auf /* funktioniert, jedoch geht er dann bei jeder Anfrage in den Filter (logisch..  ), was ich nicht so optimal finde.

Im Prinzip bräuchte ich nur Anstatt der email (j_username) welche er im Principal abspeichert den eigentlichen PrimaryKey der Tabelle Benutzer (user_id).  Kann man nicht irgendwie einstellen, dass zwar die email überprüft wird aber im principal die user_id abgespeichert wird?

SELECTE user_id FROM benutzer where email = ?;

In der Realm Deklaration oder so?


----------



## maki (21. Apr 2009)

Im der Realm Konfig gibst du an, dass der user name im email Feld steht, kenne ehrlich gesagt keinen Weg das nochmals umzubiegen.


----------

