GlassFish: Web Login Failed

Hallo,

ich möchte alle Seiten die hinter localhost/webapp/edit/* liegen schützen.

Ich habe dieses Tutorial gefunden https://blogs.oracle.com/enterprisetechtips/entry/improving_jsf_security_configuration_with jedoch erhalte ich beim verlinkten Sample eine 404 Page. Hat vlt. jemand noch andere Tutorials zu diesem Thema + Samples?

Vielleicht kann man ja auch was mit .htacces machen? Für den Fall, dass es nicht unbedingt mit Java EE sein soll…

Ich gehe aus deiner Post-Historie mal davon aus, dass du JSF benutzt:

http://blog.triona.de/tag/securing-jsf

*** Edit ***

Also ich habe das ganze nochmal probiert mit dem Glassfish Server. Ich erhalte eine Fehlermeldung, dass der Login nicht funktioniert hat, aber warum genau lässt sich nicht feststellen.

Den LoginBean habe ich 1:1 aus dem Tutorial übernommen und erhalte in der Zeile request.login(username, password); die folgende Fehlermeldung:

WARNING: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Failed file login for martin.
SEVERE: javax.servlet.ServletException: Login failed
at org.apache.catalina.authenticator.AuthenticatorBase.doLogin(AuthenticatorBase.java:959)
at org.apache.catalina.authenticator.AuthenticatorBase.login(AuthenticatorBase.java:939)
at org.apache.catalina.connector.Request.login(Request.java:2245)
at org.apache.catalina.connector.Request.login(Request.java:2224)
at org.apache.catalina.connector.RequestFacade.login(RequestFacade.java:1113)
at Get.Bean.UserLoginBean.login(UserLoginBean.java:41)
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:606)
at javax.el.ELUtil.invokeMethod(ELUtil.java:326)
at javax.el.BeanELResolver.invoke(BeanELResolver.java:536)
at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:256)
at com.sun.el.parser.AstValue.invoke(AstValue.java:269)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
[…]
WARNING: JSF1064: Unable to find or serve resource, /wie-koche-ich.xhtml.

Die DB sieht bei mir so aus

[SQL]
CREATE TABLE IF NOT EXISTS c_user (
NAME varchar(15) NOT NULL,
PASSWORD varchar(15) default NULL,
ROLE_ROLENAME varchar(15) default NULL,
PRIMARY KEY (NAME),
KEY FK_c_user_ROLE_ROLENAME (ROLE_ROLENAME)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `c_user_role` (
  `ROLENAME` varchar(15) NOT NULL,
  PRIMARY KEY  (`ROLENAME`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

[/SQL]

Die persistence.xml :

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="wie-koche-ichPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>fesnas</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <!-- <property name="eclipselink.logging.level" value="FINEST"/> -->
      <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
      <property name="hibernate.connection.CharSet" value="UTF-8"/>
      <property name="hibernate.connection.characterEncoding" value="UTF-8"/>
      <property name="hibernate.connection.useUnicode" value="true"/>
      <property name="eclipselink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

und meine web.xml

    <security-constraint>
        <display-name>administration</display-name>
        <web-resource-collection>
            <web-resource-name>administration</web-resource-name>
            <description>authorisation area</description>
            <url-pattern>/edit/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <description/>
            <role-name>Koch</role-name>
        </auth-constraint>
    </security-constraint>
    <login-config>
        <auth-method>FORM</auth-method>
        <realm-name>loginRealm</realm-name>
        <form-login-config>
            <form-login-page>/viewLogin.jsf</form-login-page>
            <form-error-page>/viewError.jsf</form-error-page>
        </form-login-config>
    </login-config>
    <security-role>
        <description/>
        <role-name>Koch</role-name>
    </security-role>

Daraus habe ich dann die Glassfish Konfiguration abgeleitet:

Wie bereits gesagt, die Fehlermeldung ist zu allgemein, als das ich sagen könnte die Fehlermeldung liegt bei der Glassfish konfiguration oder auf Seiten der WebApp.

Was mir aufgefallen ist, dass in der persistence.xml ein anderere Provider steht wie im Glassfish loginRealm. Ist das ein Problem? Wie kann ich die Fehlerquelle eingrenzen? Wo könnte das Problem liegen?

pff, irgendwelche GlassFish-Konfigurationen?
na ist auch Java, muss wohl hier sein falls es keinen besseren Platz gibt, vielleicht lohnt sich aber noch ein neues Thema
oder ich werde mal dieses hier umbenennen

zweite Hälfte meines Postings ist kleiner Hinweis auf zwei Suchergebnisse zur Fehlermelung ‚WEB9102: Web Login Failed‘,
gibt auch noch andere

Zitat aus dem zweiten:

In your jdbcRealm setup in Glassfish, be sure to write „none“ in the Algorithm (instead of SHA-256 or anything else). If you leave the field blank, it won’t work.

Danke für die Links!
Ich habe mich an den Tutorials JDBC Security Realm and form based Authentication on GlassFish with Primefaces und JDBC Realm and Form Based Authentication with GlassFish 3.1.2.2 and Primefaces 3.4 - DZone orientiert.
Das Debugging habe ich auf Finest umgestellt und im GlassfishServer den Realm nicht in der „default-config“ sondern im „server-config“ gesetzt.

Außerdem habe ich bemerkt, dass die DataSource im Webprojekt welche in der persistence.xml steht nicht zwangsläufig in den GlassfishServer Resources vorhanden sein muss. Bei mir war diese zufälligerweise gleich benannt wie in der persistence.xml somit sollte die Verbindung zur MySQL DB in Ordnung sein.

Die DB Struktur musste ich ändern, da die alte nicht druchdacht ware. Man konnte einem Benutzer nur eine Gruppe zuweisen. Außerdem sollte ich damit diesem Problem http://www.java-forum.org/allgemeines-ee/126421-benutzerauthentifizierung.html aus dem Weg gegangen sein.

[SQL]CREATE TABLE IF NOT EXISTS c_user (
NAME varchar(15) NOT NULL,
PASSWORD varchar(45) default NULL,
PRIMARY KEY (NAME)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO c_user (NAME, PASSWORD) VALUES
(‚martin‘, ‚admin‘);

CREATE TABLE IF NOT EXISTS c_user_c_user_role (
User_NAME varchar(15) NOT NULL,
Role_ROLENAME varchar(15) NOT NULL,
PRIMARY KEY (User_NAME,Role_ROLENAME),
KEY FK_c_user_c_user_role_Role_ROLENAME (Role_ROLENAME)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO c_user_c_user_role (User_NAME, Role_ROLENAME) VALUES
(‚martin‘, ‚Koch‘);

CREATE TABLE IF NOT EXISTS c_user_role (
ROLENAME varchar(15) NOT NULL,
PRIMARY KEY (ROLENAME)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO c_user_role (ROLENAME) VALUES
(‚Koch‘);
[/SQL]

In der Web.xml ist der <realm-name>loginRealm</realm-name> angegeben woraus sich folgende Konfiguration im Glassfish ergeben hat:

JAAS Context: loginRealm
JNDI:fesnas
UserTable:c_user
User Name Column: NAME
Password Column: PASSWORD
Group Table: c_user_c_user_role
Group Table User Name Column: User_NAME
Group Name Column: Role_ROLENAME
Password Encryption Algorithm: none
Digest Algorithm: none

Trotzdem erhalte ich nach wie vor beim login ausgelöst durch request.login(username, password); die Fehlermeldung:

WARNING: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: No LoginModules configured for loginRealm
SEVERE: javax.servlet.ServletException: Login failed

Es scheint als würde er den loginReam welche im Web.xml angegeben ist nicht finden. Im Web erstellen manche dazu eine jaas.config aber eine solche ist in den oberen angegeben Tutorials nicht angegeben.

Ich bin gerade kurz angebunden.

Ich habe mal ein Tutorial für den JBoss und JAAS geschrieben. Vielleicht hilft Dir das: http://larmic.blogspot.de/2013/08/jaas-im-jboss-7x-bzw-eap-61.html

Hallo,

mein Projekt läuft jetzt mit Glassfish 4 und Realm. Es waren einige kleine Details die viel Zeit gekostet haben.

Hier ein genauer Überblick http://www.get-the-solution.net/index-blog-1-14-166-Glassfish-4-and-Real.html