# Benutzerauthentifizierung



## Smoothi (1. Nov 2011)

Hey, ich habe noch so meine Probleme mit einer Benutzerauthentifizierung.

Ich beziehe mich auf diese Anleitung:
Triona Weblog  Sicherheit in Java-EE6-Webapplikationen


Zunächst versuche ich zu erklären, was ich gemacht habe:
1. Ich benötigte einen JDBCRealm, also habe ich mir in meiner Oracle-Datenbank eine Tabelle "Benutzer" (ID, Login, Passwort, Rolle) und "Rolle" (ID, Name), sowie einen Testbenutzer mit der Rolle Admin angegelegt. Benutzer.Rolle ist ein Fremdschlüssel auf Rolle.ID.

2. In meinem Projekt habe ich im WEB-INF-Verzeichnis die "glassfish-web.xml" angelegt (Testsystem ist Glasshfish, später wahrscheinlich JBoss). Diese sieht wie folgt aus:

[XML]<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
    <security-role-mapping>
        <role-name>admin</role-name>
        <group-name>admin</group-name>
    </security-role-mapping>
    <security-role-mapping>
        <role-name>employee</role-name>
        <group-name>employee</group-name>
    </security-role-mapping>

    <class-loader delegate="true"/>
    <jsp-config>
        <property name="keepgenerated" value="true">
            <description>Keep a copy of the generated servlet class' java code.</description>
        </property>
    </jsp-config>
</glassfish-web-app>[/XML] 

3. Im Tutorial steht, dass die Datenbank dem Server bekannt gemacht werden muss. Also einen JDBC-Verbindungspool und eine JDBC-Ressource habe ich bereits angelegt. Die Anwendung läuft soweit ja auch bereits. Bedeutet das, ich muss meine Entity-Klasse für die Benutzer noch per JNDI-Bekannt machen?

Unter Ressourcen/JNDI kann ich ja einen neuen JNDI anlegen. Ich vermute mal das ist ein externer JNDI.
JNDI-Name: jdbc/sysbuch
Ressourcentyp: Operator (meine Entity-Klasse für die Benutzer) 

Bei Factory-Klasse und JNDI-Suche bin ich überfragt.

Oder benötige ich das garnicht?

*EDIT: Sollte eigentlich überflüssig sein, da die Anwendugn ja bereits über die persistence.xml über den JNDI der Datanbankverbindung bescheid weiß. *

4. Im Glassfish habe ich den Realm angelegt mit folgenden Daten:

Bereichsname: loginRealm
Klassenname: com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm 

JAAS-Kontext: jdbcRealm
JNDI: jdbc/sysbuch (selber Name wie der Verbindungspool)
Benutzertabelle: benutzer
Benutzernamenspalte: login
Passwortspalte: passwort
Gruppentabelle: rolle
Gruppennamenspalte: name (Bezeichnung in der Rollentabelle)
Digest-Algorithmus: none

5. Die Login-Seite und die LoginBean sind sehr ähnlich wie im Tutorial. Die funktionieren auch.

Mein Bean ist auch sehr ähnlich:

```
@Named("loginPM")
@SessionScoped
public class LoginPM implements Serializable {

    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    
    public String login() {
        FacesContext fc = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) fc.getExternalContext().getRequest();
        try {
            //Login per Servlet 3.0
            request.login(username, password);

            // Der Principal entspricht dem Usernamen
            Principal principal = request.getUserPrincipal();

            // Wir können hier nur abfragen, ob der User eine Rolle hat (isUserInRole('whatever')),
            // aber wir können NICHT die Rolle aktiv erfragen (z.B. mit getUserRole(...))
            if (request.isUserInRole("admin")) {
                String msg = "User: " + principal.getName() + ", Role: admin";
                fc.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, msg, null));
                return "login";
            } else if (request.isUserInRole("employee")) {
                String msg = "User: " + principal.getName() + ", Role: employee";
                fc.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, msg, null));
                return "login";
            }
            
            return "du_musst_die_rollen_noch_definieren";	// hier sollte etwas sinnvolles passieren ;-)
        } catch (Exception e) {
            System.out.println("Fehler!");
        }
        return "login";
    }

    public void logout() {
        FacesContext fc = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);
        if (session != null) {
            session.invalidate();
        }
        fc.getApplication().getNavigationHandler().handleNavigation(fc, null, "/login.xhtml");
    }
}
```
 
6. Zum Schluss habe ich noch die web.xml angepasst, die jetzt wie folgt aussieht:
[XML]<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Producer</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>

    <login-config>
        <auth-method>FORM</auth-method>
        <realm-name>SysBuchRealm</realm-name>
        <form-login-config>
            <form-login-page>/faces/login.xhtml</form-login-page>
            <form-error-page>/faces/login.xhtml</form-error-page>
        </form-login-config>
    </login-config>
    <security-role>
        <description/>
        <role-name>admin</role-name>
    </security-role>
    <security-role>
        <description/>
        <role-name>employee</role-name>
    </security-role>

</web-app> [/XML]

7. Nun wollte ich mich einloggen und er springt immer in den CATCH-Block der login-Methode.

Vermutlich liegt es an der JNDI-Sache. Ich finde leider nicht allzuviel sinnvolles zu dem Thema bzw. versteh ich es in dem Tutorial nicht so ganz.

Vielen Dank schonmal


----------



## Sym (1. Nov 2011)

Die Exception im Catch-Block sollte mehr Auskunft geben. Welche Exception wird denn geworfen und wie sieht der Stacktrace aus?


----------



## Smoothi (1. Nov 2011)

eine LoginException

*Aus dem Serverlog*

```
Warnung: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Dateianmeldung für test fehlgeschlagen.
Warnung: Exception com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Dateianmeldung für test fehlgeschlagen.
	at com.sun.enterprise.security.auth.login.LoginContextDriver.doPasswordLogin(LoginContextDriver.java:394)
	at com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:240)
	at com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:153)
	at com.sun.web.security.RealmAdapter.authenticate(RealmAdapter.java:512)
	at com.sun.web.security.RealmAdapter.authenticate(RealmAdapter.java:453)
	at org.apache.catalina.connector.Request.login(Request.java:1932)
	at org.apache.catalina.connector.Request.login(Request.java:1895)
	at org.apache.catalina.connector.RequestFacade.login(RequestFacade.java:1146)
	at presentation.LoginPM.login(LoginPM.java:45)
	at presentation.org$jboss$weld$bean-web-ManagedBean-class_presentation$LoginPM_$$_WeldClientProxy.login(org$jboss$weld$bean-web-ManagedBean-class_presentation$LoginPM_$$_WeldClientProxy.java)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at com.sun.el.parser.AstValue.invoke(AstValue.java:234)
	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
	at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:43)
	at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:56)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:722)
Caused by: javax.security.auth.login.LoginException: Dateianmeldung für test fehlgeschlagen.
	at com.sun.enterprise.security.auth.login.FileLoginModule.authenticate(FileLoginModule.java:84)
	at com.sun.enterprise.security.auth.login.PasswordLoginModule.authenticateUser(PasswordLoginModule.java:117)
	at com.sun.appserv.security.AppservPasswordLoginModule.login(AppservPasswordLoginModule.java:148)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at javax.security.auth.login.LoginContext.invoke(LoginContext.java:784)
	at javax.security.auth.login.LoginContext.access$000(LoginContext.java:203)
	at javax.security.auth.login.LoginContext$4.run(LoginContext.java:698)
	at javax.security.auth.login.LoginContext$4.run(LoginContext.java:696)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:695)
	at javax.security.auth.login.LoginContext.login(LoginContext.java:594)
	at com.sun.enterprise.security.auth.login.LoginContextDriver.doPasswordLogin(LoginContextDriver.java:382)
	... 52 more
```

*per printStackTrace()*

```
Schwerwiegend: javax.servlet.ServletException: Exception thrown while attempting to authenticate for user: test at org.apache.catalina.connector.Request.login(Request.java:1964)
	at org.apache.catalina.connector.Request.login(Request.java:1895)
	at org.apache.catalina.connector.RequestFacade.login(RequestFacade.java:1146)
	at presentation.LoginPM.login(LoginPM.java:45)
	at presentation.org$jboss$weld$bean-web-ManagedBean-class_presentation$LoginPM_$$_WeldClientProxy.login(org$jboss$weld$bean-web-ManagedBean-class_presentation$LoginPM_$$_WeldClientProxy.java)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at com.sun.el.parser.AstValue.invoke(AstValue.java:234)
	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
	at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:43)
	at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:56)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:722)
Caused by: javax.servlet.ServletException: Failed login while attempting to authenticate user: test
	at org.apache.catalina.connector.Request.login(Request.java:1935)
	... 47 more

Schwerwiegend: 	at org.apache.catalina.connector.Request.login(Request.java:1964)
Schwerwiegend: 	at org.apache.catalina.connector.Request.login(Request.java:1895)
Schwerwiegend: 	at org.apache.catalina.connector.RequestFacade.login(RequestFacade.java:1146)
Schwerwiegend: 	at presentation.LoginPM.login(LoginPM.java:45)
Schwerwiegend: 	at presentation.org$jboss$weld$bean-web-ManagedBean-class_presentation$LoginPM_$$_WeldClientProxy.login(org$jboss$weld$bean-web-ManagedBean-class_presentation$LoginPM_$$_WeldClientProxy.java)
Schwerwiegend: 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Schwerwiegend: 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
Schwerwiegend: 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Schwerwiegend: 	at java.lang.reflect.Method.invoke(Method.java:601)
Schwerwiegend: 	at com.sun.el.parser.AstValue.invoke(AstValue.java:234)
Schwerwiegend: 	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
Schwerwiegend: 	at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:43)
Schwerwiegend: 	at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:56)
Schwerwiegend: 	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
Schwerwiegend: 	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
Schwerwiegend: 	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
Schwerwiegend: 	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
Schwerwiegend: 	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
Schwerwiegend: 	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
Schwerwiegend: 	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
Schwerwiegend: 	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
Schwerwiegend: 	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
Schwerwiegend: 	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
Schwerwiegend: 	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
Schwerwiegend: 	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
Schwerwiegend: 	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
Schwerwiegend: 	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
Schwerwiegend: 	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
Schwerwiegend: 	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
Schwerwiegend: 	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
Schwerwiegend: 	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
Schwerwiegend: 	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
Schwerwiegend: 	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
Schwerwiegend: 	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
Schwerwiegend: 	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
Schwerwiegend: 	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
Schwerwiegend: 	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
Schwerwiegend: 	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
Schwerwiegend: 	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
Schwerwiegend: 	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
Schwerwiegend: 	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
Schwerwiegend: 	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
Schwerwiegend: 	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
Schwerwiegend: 	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
Schwerwiegend: 	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
Schwerwiegend: 	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
Schwerwiegend: 	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
Schwerwiegend: 	at java.lang.Thread.run(Thread.java:722)
Schwerwiegend: Caused by: javax.servlet.ServletException: Failed login while attempting to authenticate user: test
Schwerwiegend: 	at org.apache.catalina.connector.Request.login(Request.java:1935)
Schwerwiegend: 	... 47 more
```


----------



## Smoothi (1. Nov 2011)

ich hab gerade gesehen, dass ich den Realm in der web.xml und im Glassfish unterschiedlich nannte. Jetzt heißt er auch in der XML loginRealm. Das Ergebnis ist aber das Gleiche. :/


----------



## mjustin (1. Nov 2011)

Anscheinend wird ein FileRealm anstatt eines JDBC Realms verwendet, im Stack Trace erscheint com.sun.enterprise.security.auth.login.FileLoginModule und im Log "Dateianmeldung".

In web.xml steht "SysBuchRealm", der JDBC Bereichsname im GlassFish ist aber "loginRealm", kann es daran liegen?


----------



## Smoothi (2. Nov 2011)

Ja, wie gesagt. Der Fehler ist mir im Nachhinein aufgefallen. Kann den ersten Post nur leider nicht mehr editieren. Hab das jedenfalls schon behoben. Die Fehlermeldung hat sich dadurch, wie ich gerade sehe, geändert:


```
Schwerwiegend: SEC1111: Cannot load group for JDBC realm user [test].
Warnung: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception
Warnung: Exception
com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception
	at com.sun.enterprise.security.auth.login.LoginContextDriver.doPasswordLogin(LoginContextDriver.java:394)
	at com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:240)
	at com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:153)
	at com.sun.web.security.RealmAdapter.authenticate(RealmAdapter.java:512)
	at com.sun.web.security.RealmAdapter.authenticate(RealmAdapter.java:453)
	at org.apache.catalina.connector.Request.login(Request.java:1932)
	at org.apache.catalina.connector.Request.login(Request.java:1895)
	at org.apache.catalina.connector.RequestFacade.login(RequestFacade.java:1146)
	at presentation.LoginPM.login(LoginPM.java:44)
	at presentation.org$jboss$weld$bean-web-ManagedBean-class_presentation$LoginPM_$$_WeldClientProxy.login(org$jboss$weld$bean-web-ManagedBean-class_presentation$LoginPM_$$_WeldClientProxy.java)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at com.sun.el.parser.AstValue.invoke(AstValue.java:234)
	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
	at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:43)
	at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:56)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:722)
Caused by: javax.security.auth.login.LoginException: Security Exception
	at javax.security.auth.login.LoginContext.invoke(LoginContext.java:870)
	at javax.security.auth.login.LoginContext.access$000(LoginContext.java:203)
	at javax.security.auth.login.LoginContext$4.run(LoginContext.java:698)
	at javax.security.auth.login.LoginContext$4.run(LoginContext.java:696)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:695)
	at javax.security.auth.login.LoginContext.login(LoginContext.java:594)
	at com.sun.enterprise.security.auth.login.LoginContextDriver.doPasswordLogin(LoginContextDriver.java:382)
	... 52 more
Caused by: java.lang.SecurityException
	at javax.security.auth.login.LoginContext.invoke(LoginContext.java:871)
	... 59 more
```

In der Gruppentabelle habe ich mit der ID 1 den "admin". Diesen habe ich dem Benutzer "test" zugewiesen.


----------



## Smoothi (2. Nov 2011)

Ok, wenn ich den Benutzer eine neue Spalte hinterlege "Gruppe" in der ich die Rolle direkt reinschreib, funktioniert es. Problem ist nur wenn die Gruppen aus einer separaten Tabelle kommen.

Also die Tabelle heißt "Rolle", die Gruppenbezeichnung "Rolle.Name"

Also habe ich im Realm
Gruppentabelle: Rolle
Gruppennamenspalte: Name

Jedoch, woher soll Realm wissen welche Spalte in der Benutzertabelle der Fremdschlüssel für die Gruppentabelle is... das kann ja nirgendwo definiert werden


----------



## Smoothi (4. Nov 2011)

Ok, habe es mit einem View gelöst. Somit Thema erledigt


----------



## mjustin (6. Nov 2011)

Smoothi hat gesagt.:


> Ok, wenn ich den Benutzer eine neue Spalte hinterlege "Gruppe" in der ich die Rolle direkt reinschreib, funktioniert es. Problem ist nur wenn die Gruppen aus einer separaten Tabelle kommen.
> 
> Also die Tabelle heißt "Rolle", die Gruppenbezeichnung "Rolle.Name"
> 
> ...



Bei JAAS über JDBC wird in der Rollentabelle anhand des Login-ID Wertes gesucht, d.h. wenn login = 'schmitz' ist, werden auch in der Rollentablle Sätze mit login = 'Schmitz' gesucht und das Feld 'Gruppennamenspalte' ausgelesen. 

Bei JBoss wird das SQL Statement in JAAS JDBC Modulen angegeben, hier kann man es direkt sehen:

<module-option name = "rolesQuery">SELECT LOGIN, 'Roles' FROM ROLES WHERE LOGIN=?</module-option>

(siehe Chapter8.Security on JBoss)

Bei GlassFish vermutlich geht es ebenfalls wenn in der Rollentabelle das 'login' Feld (gleicher Feldname wie das ID Feld in der Benutzertabelle) existiert.


----------



## Smoothi (7. Nov 2011)

Danke für die Erleuterung  Jetzt versteh ich auch wieso/weshalb


----------

