Benutzerauthentifizierung

Smoothi

Bekanntes Mitglied
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:
Java:
@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 ;)
 
Zuletzt bearbeitet:
S

Sym

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

Smoothi

Bekanntes Mitglied
eine LoginException

Aus dem Serverlog
Code:
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()
Code:
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

Bekanntes Mitglied
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

Aktives Mitglied
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

Bekanntes Mitglied
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:

Code:
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.
 
Zuletzt bearbeitet:

Smoothi

Bekanntes Mitglied
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
 
Zuletzt bearbeitet:

mjustin

Aktives Mitglied
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

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.
 

Neue Themen


Oben