IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Glassfish et Payara Java Discussion :

Roles dans un JDBC Realm


Sujet :

Glassfish et Payara Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2012
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2012
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Roles dans un JDBC Realm
    Bonjour,
    Je m'appelle Antoine, et je suis actuellement en train de bosser sur le développement d'une application Java Web. L'application est déployée via Glassfish 3.1.2, j'utilise NetBeans7.2, et une base de données est déployée via WAMP server2.2. La vue est implémentée avec Primefaces 3.4.1.
    Mon post est assez lourd, j'ai essayé de le rendre lisible mais si y'a moyen de mieux faire n'hésitez pas à me le dire.

    De façon générale, mon problème est le suivant : dans mon cahier des charges, je dois avoir 4 types différents d'utilisateurs, avec différents accès aux fonctionnalités ; cependant je ne parviens pas à correctement implémenter le tout (ou du moins les messages d'erreur sur la console Glassfish ne me plaisent pas du tout).

    Tout d'abord, si je décris la base de donnée, 3 tables sont importantes :

    Table principals
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ID     User     Password
    1     vigrid    1894d2de64eb73deddded83705326bdc
    2     eitri    a903479b4b49b5d1f0710e1f934a9c75
    3     thor    575e22bc356137a41abdef379b776dba
    4     odin    e44985980c9d3c5d70b6a548b14d773a
    5     loki    e64cfa3fd59e32df57003c7401f48c99
    Table roles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ID     Name
    1     read
    2     annotate
    3     vanguard
    4     admin
    Table principal_roles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Principals_Ref     Roles_Ref
    1 [->]     1 [->]
    2 [->]     2 [->]
    3 [->]     3 [->]
    4 [->]     4 [->]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra
    1     SIMPLE     principals_roles     index     NULL    fk_Principals_Roles_Roles1     1     NULL    4     Using index
    Soit donc une table d'utilisateurs, une table de roles, une table de mise en relation.

    Deuxième partie importante : la configuration du realm JDBC dans Glassfish.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Nom de configuration : server-config
    Nom de domaine : framenet
    Nom de classe : com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm
     
    Propriétés propres à cette classe
    Contexte de JAAS : Obligatoire
    JNDI: jdbc/framenet
    Table utilisateurs : principals
    Colonne de noms utilisateur : User
    Colonne de mots de passe : Password
    Table de groupes : roles
    Colonne du nom utilisateur de la table de groupe :
    Colonne de noms de groupes : Name
    Affecter des groupes : 
    Utilisateur de la base de données :
    Mot de passe de la base de données :
    Algorithme condensé : MD5
    Algorithme de cryptage du mot de passe : MD5
    Codage :
    Jeu de caractères :
    Mon fichiers Glassfish-web.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <?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="">
      <parameter-encoding default-charset="UTF-8" />
      <security-role-mapping>
        <role-name>admin</role-name>
        <principal-name>odin</principal-name>
        <group-name>admin</group-name>
      </security-role-mapping>
      <security-role-mapping>
        <role-name>read</role-name>
        <principal-name>vigrid</principal-name>
        <group-name>read</group-name>
      </security-role-mapping>
      <security-role-mapping>
        <role-name>vanguard</role-name>
        <principal-name>thor</principal-name>
        <group-name>admin</group-name>vanguard
      </security-role-mapping>
      <security-role-mapping>
        <role-name>annotate</role-name>
        <principal-name>eitri</principal-name>
        <group-name>annotate</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>
    Mon fichier web.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    <?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>Development</param-value>
        </context-param>
        <filter>
            <filter-name>FileUpload Filter</filter-name>
            <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>FileUpload Filter</filter-name>
            <servlet-name>Faces Servlet</servlet-name>
        </filter-mapping>
        <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>
        
        <security-role>
            <description>These users can read frame reports</description>
            <role-name>read</role-name>
        </security-role>
        <security-role>
            <description>These users can annotate texts</description>
            <role-name>annotate</role-name>
        </security-role>
        <security-role>
            <description>These users can annotate texts and create frames</description>
            <role-name>vanguard</role-name>
        </security-role>
        <security-role>
            <description>These users can do whatever they want</description>
            <role-name>admin</role-name>
        </security-role>
        
        <security-constraint>
            <display-name>AccessConstraint</display-name>
            <web-resource-collection>
                <web-resource-name>Application</web-resource-name>
                <description/>
                <url-pattern>/faces/index.xhtml</url-pattern>
            </web-resource-collection>
            <auth-constraint>
                <description/>
                <role-name>read</role-name>
                <role-name>annotate</role-name>
                <role-name>vanguard</role-name>
                <role-name>admin</role-name>
            </auth-constraint>
        </security-constraint>
     
        <login-config>
            <auth-method>FORM</auth-method>
            <realm-name>framenet</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>
    </web-app>
    Avec cette configuration donc, je ne peux connecter aucun utilisateur, après avoir tenté les 5 j'obtiens la série d'erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SEVERE: SEC1111: Cannot load group for JDBC realm user [vigrid].
    WARNING: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception
    INFO: Exception thrown while attempting to authenticate for user: vigrid
    SEVERE: SEC1111: Cannot load group for JDBC realm user [eitri].
    WARNING: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception
    INFO: Exception thrown while attempting to authenticate for user: eitri
    SEVERE: SEC1112: Cannot validate user [thor] for JDBC realm.
    SEVERE: SEC1111: Cannot load group for JDBC realm user [thor].
    WARNING: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception
    INFO: Exception thrown while attempting to authenticate for user: thor
    SEVERE: SEC1112: Cannot validate user [odin] for JDBC realm.
    SEVERE: SEC1111: Cannot load group for JDBC realm user [odin].
    WARNING: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception
    INFO: Exception thrown while attempting to authenticate for user: odin
    SEVERE: SEC1111: Cannot load group for JDBC realm user [loki].
    WARNING: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception
    INFO: Exception thrown while attempting to authenticate for user: loki
    Et là on commence à voir la première chose étrange : les deux utilisateurs eitri et vigrid ont un traitement différent de odin, thor et loki... Je ne parviens vraiment pas à savoir pourquoi.

    Maintenant, si je change la ligne "Affecter des groupes" dans la config glassfish en mettant "read", je parviens à connecter tous les utilisateurs. J'ai mis une fonction qui me permet de savoir les roles de chaque utilisateur, en utilisant IsUserInRole(). J'obtiens donc le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SEVERE: SEC1111: Cannot load group for JDBC realm user [vigrid].
    INFO: Authenticated user: vigrid
    INFO: [read] is connected
    SEVERE: SEC1111: Cannot load group for JDBC realm user [eitri].
    INFO: Authenticated user: eitri
    INFO: [read, annotate] is connected
    SEVERE: SEC1112: Cannot validate user [thor] for JDBC realm.
    SEVERE: SEC1111: Cannot load group for JDBC realm user [thor].
    INFO: Authenticated user: thor
    INFO: [read, vanguard] is connected
    SEVERE: SEC1112: Cannot validate user [odin] for JDBC realm.
    SEVERE: SEC1111: Cannot load group for JDBC realm user [odin].
    INFO: Authenticated user: odin
    INFO: [admin, read] is connected
    Autre exemple : si en plus de mettre "read" dans "affecter des groupes" je change le glassfish-web.xml en supprimant toutes les balises <group-name>...</group-name>, et que je ne gère plus les autorisations avec des groupes mais uniquement avec les principals, je peux connecter tous les utilisateurs, ils ont les bons roles, mais il y a encore un message d'erreur avec Glassfish. Je pourrais me contenter de ça, car avec cette façon de procéder je peux vraiment différencier les utilisateurs, mais ce n'est pas satisfaisant pour plusieurs raisons. Tout d'abord il y a des messages d'erreurs, que je ne comprend pas en plus. Et ensuite si je dois avoir une trentaine d'utilisateurs, la création de groupes va commencer à être plutôt nécessaire.
    Voilà les messages que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SEVERE: SEC1111: Cannot load group for JDBC realm user [vigrid].
    INFO: Authenticated user: vigrid
    INFO: [read] is connected
    SEVERE: SEC1111: Cannot load group for JDBC realm user [eitri].
    INFO: Authenticated user: eitri
    INFO: [annotate] is connected
    SEVERE: SEC1112: Cannot validate user [thor] for JDBC realm.
    SEVERE: SEC1111: Cannot load group for JDBC realm user [thor].
    INFO: Authenticated user: thor
    INFO: [vanguard] is connected
    SEVERE: SEC1112: Cannot validate user [odin] for JDBC realm.
    SEVERE: SEC1111: Cannot load group for JDBC realm user [odin].
    INFO: Authenticated user: odin
    INFO: [admin] is connected
    Voilà. Notez que j'ai pas tenté avec Loki, ce sombre personnage faisant la plupart du temps complétement planter l'appli



    Merci à tous ceux qui ont lu mon post jusqu'ici, j'espère que quelqu'un aura une proposition à me faire ! J'ai essayé d'être complet, mais je suis débutant dans le domaine de l'info, donc j'ai peut-être oublié quelques parties fondamentales. Dites-le moi si c'est le cas, je compléterai !

    Antoine

  2. #2
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Bonjour Antoine et bienvenue sur le forum

    à tout hasard, as tu essayé de ventiler ton fichier glassfish-web.xml de la sorte ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <security-role-mapping>
        <role-name>admin</role-name>    
        <group-name>admin</group-name>
    </security-role-mapping>
    <security-role-mapping>
        <role-name>admin</role-name>
        <principal-name>odin</principal-name>    
     </security-role-mapping>
    au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <security-role-mapping>
        <role-name>admin</role-name>
        <principal-name>odin</principal-name>
        <group-name>admin</group-name>
     </security-role-mapping>

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2012
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2012
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Tout d'abord merci pour la réponse et le message d'accueil ! Je suis au Japon en ce moment, donc j'aurais sûrement un décalage dans mes réponses ; au moins j'essaierai de vérifier régulièrement durant la journée si la discussion a été mise à jour.

    J'ai changé le glassfish-web comme tu as proposé, mais ça n'a pas réglé le problème. J'obtiens le même résultat en sortie : pas de connexion possible si je n'affecte pas de groupe dans le panneau de configuration de Glassfish, et un traitement différent selon qu'il s'agisse des utilisateurs Eitri&Vigrid ou Odin&Thor.


  4. #4
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Salut,

    tu peux tester cela :

    1. aller dans la console d'administration GF
    2. configurations > server-config > paramètres du journaliseur
    3. ajouter un journaliseur
    4. choisir "com.sun.enterprise.security" et le niveau "FINEST"
    5. mettre aussi le logger existant "javax.enterprise.system.core.security" à "FINEST"
    6. rebooter GF


    Ensuite normalement dans les logs GF à chaque tentative d'authentification tu verras la requête SQL générée par le realm. Tu as qu'à essayer de la copier sous PHPMyAdmin (wamp) pour voir si elle te ramène quelque chose afin de voir si les infos que tu as fournis sur la configuration du realm sont bonnes.

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2012
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2012
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Désolé pour cette réponse un peu tardive, le mercredi je suis des cours et je n'ai pas eu le temps d'aller au laboratoire.

    Je teste ta proposition aujourd'hui, merci pour ton aide !

  6. #6
    Futur Membre du Club
    Inscrit en
    Novembre 2012
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2012
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    J'ai mis ce que j'obtiens quand j'essaie de connecter Vigrid (role:read) ci-dessous. J'ai limité, sinon c'était trop grand pour un seul post. Si il manque une partie intéressante je corrigerai !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    FINE: [Web-Security] Setting Policy Context ID: old = null ctxID = Framenet/Framenet
    FINE: [Web-Security] hasUserDataPermission perm: ("javax.security.jacc.WebUserDataPermission" "/faces/login.xhtml" "POST")
    FINE: [Web-Security] hasUserDataPermission isGranted: true
    FINEST: Processing login with credentials of type: class com.sun.enterprise.security.auth.login.common.PasswordCredential
    FINE: Logging in user [vigrid] into realm: framenet using JAAS module: jdbcRealm
    FINE: Login module initialized: class com.sun.enterprise.security.auth.login.JDBCLoginModule
    SEVERE: SEC1111: Cannot load group for JDBC realm user [vigrid].
    FINE: Cannot load group
    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'User' in 'where clause'
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    	at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    	at com.mysql.jdbc.Util.getInstance(Util.java:386)
    	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
    	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
    	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
    	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
    	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
    	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)
    	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)
    	at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2293)
    	at com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm.findGroups(JDBCRealm.java:550)
    	at com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm.authenticate(JDBCRealm.java:331)
    	at com.sun.enterprise.security.auth.login.JDBCLoginModule.authenticate(JDBCLoginModule.java:76)
    	at com.sun.enterprise.security.auth.login.PasswordLoginModule.authenticateUser(PasswordLoginModule.java:117)
    	at com.sun.appserv.security.AppservPasswordLoginModule.login(AppservPasswordLoginModule.java:143)
    	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)
    	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:514)
    	at com.sun.web.security.RealmAdapter.authenticate(RealmAdapter.java:455)
    	at org.apache.catalina.connector.Request.login(Request.java:1938)
    	at org.apache.catalina.connector.Request.login(Request.java:1901)
    	at org.apache.catalina.connector.RequestFacade.login(RequestFacade.java:1146)
    	at jp.ac.keio.hc.st.jfn.jsf.primefaces.LoginBean.login(LoginBean.java:67)
    	at jp.ac.keio.hc.st.jfn.jsf.primefaces.LoginBean$Proxy$_$$_WeldClientProxy.login(LoginBean$Proxy$_$$_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:254)
    	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:302)
    	at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:39)
    	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: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:1550)
    	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 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
    	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
    	at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
    	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
    	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
    	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
    	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
    	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
    	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)
     
    FINEST: JDBC login succeeded for: vigrid groups:[read]
    FINE: JAAS login complete.
    FINE: JAAS authentication committed.
    FINE: Password login succeeded for : vigrid
    FINE: Set security context as user: vigrid
    INFO: Authenticated user: vigrid
    Le journaliseur semble indiquer que lors de la requête "where" il ne trouve pas la colonne "User", mais il ne donne pas la requête SQL exécutée.
    Je me demande si l'erreur vient du fait que dans la table principals_roles il n'y a pas de colonne "User" : peut-être est-ce nécessaire que le nom soit le même ? J'ai essayé de créer cette colonne User, ça n'a pas marché, mais je ne suis pas particulièrement doué avec SQL, il est donc possible qu'il y ait eu une mauvaise manip de ma part.
    Par ailleurs, quelque chose m'étonne : la table principals_roles, qui lie les principals aux roles, n'est pas mentionnée dans la définition du Realm. Comment Glassfish peut-il savoir qu'il s'agit d'une table de mise en relation des principaux avec leurs rôles ?

  7. #7
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Salut,

    ici à la ligne 200 tu as les requêtes générées pour récupération des mots de passe et des groupes ce que tu nommes à tord "role" ici (groupe->BDD, role->Application JEE).

    Tout ça pour dire que la requête de récupération des groupes utilise la variable groupTableUserNameColumn qui ne semble pas définie dans ton realm (cf: "Colonne du nom utilisateur de la table de groupe :" qui est non renseignée).

    J'utilise un realm JDBC pour une appli et je pense que la meilleure solution est de créer une vue SQL regroupant les utilisateur, leurs mots de passe ainsi que les groupes associés.

    En gros tu gardes tes tables telles quelles et tu rajoutes une vue comprenant les champs User, Password et Name produits à partir de tes 3 tables. Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE VIEW v_groups_users
    AS SELECT p.User, p.Password, r.Name FROM principal_roles pr
    INNER JOIN principals p ON pr.Principals_Ref = p.ID
    INNER JOIN roles r ON pr.Roles_Ref = r.ID
    (pas testé)

    Ensuite tu configures ton realm uniquement avec cetts vue, non plus avec tes 3 tables.

  8. #8
    Futur Membre du Club
    Inscrit en
    Novembre 2012
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2012
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Ça marche, merci

    J'en ai profité pour me documenter sur le SQL (y'a un bon tuto sur ce site), car pour l'instant mon niveau est pas top. Mais la requête SQL que tu avais proposée a marché nickel.

    La vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    User 	Password 	Name
    vigrid	1894d2de64eb73deddded83705326bdc	read
    eitri	a903479b4b49b5d1f0710e1f934a9c75	annotate
    thor	575e22bc356137a41abdef379b776dba 	vanguard
    odin	e44985980c9d3c5d70b6a548b14d773a 	admin
    Il reste cependant encore quelques problèmes. Grâce à la vue SQL, je n'ai plus les messages d'erreurs "cannot load group for jdbc realm user", cependant il y a toujours plusieurs choses pas normales.

    1- Il y a toujours un traitement différent selon que ce soit vigrid & eitri (roles : read & annotator), ou thor & odin (roles : vanguard & admin). Pour les deux derniers j'obtiens le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SEVERE: SEC1112: Cannot validate user [thor] for JDBC realm.
    SEVERE: SEC1112: Cannot validate user [odin] for JDBC realm.
    Alors que pour vigrid et eitri, non. Je trouve cela vraiment incompréhensible, sachant que je ne voie pas ce qui diffère entre les deux. J'ai créé les 4 utilisateurs en même temps.

    2- Les groupes ne sont absolument pas pris en compte. Ce qui me fait penser ça :
    - Si dans le fichier Glassfish-web.xml je ne mappe pas les rôles avec les principals directement, les rôles ne sont pas attribués du tout.
    Par exemple si je fais pas ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <security-role-mapping>
        <role-name>annotate</role-name>
        <principal-name>eitri</principal-name>
      </security-role-mapping>
    mais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <security-role-mapping>
        <role-name>annotate</role-name>
        <group-name>annotate</group-name>
      </security-role-mapping>
    Ça marchera pas

    - Si je change les rôles dans la database en mettant n'importe quoi, rien ne se passe.
    Il semble clair que cette partie de la base de données n'est pas prise en compte. Peut-être est-ce dû aux paramètres que j'ai rentrés dans le panneau de configuration de Glassfish ? L'erreur pourrait venir du fait que je ne parviens pas à comprendre la différence entre "Colonne du nom utilisateur de la table de groupe" et "Colonne de noms de groupes". J'ai cherché mais je ne trouve pas. J'ai mis la même chose pour les deux du coup.
    Ma configuration Glassfish :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Nom de configuration : server-config
    Nom de domaine : framenet
    Nom de classe : com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm
     
    Propriétés propres à cette classe
    Contexte de JAAS : Obligatoire
    JNDI: jdbc/framenet
    Table utilisateurs : v_users
    Colonne de noms utilisateur : User
    Colonne de mots de passe : Password
    Table de groupes : v_users
    Colonne du nom utilisateur de la table de groupe : Name
    Colonne de noms de groupes : Name
    Affecter des groupes : 
    Utilisateur de la base de données :
    Mot de passe de la base de données :
    Algorithme condensé : MD5
    Algorithme de cryptage du mot de passe : MD5
    Codage :
    Jeu de caractères :
    Sinon pour ce qui est de la différence rôles/groupes, j'avoue ne pas avoir fait attention en utilisant les termes, comme dans mon application j'ai mis les mêmes noms. Cependant je pense savoir la différence : un rôle correspond à une autorisation dans le domaine JDBC, tandis qu'un groupe correspond à un ensemble d'utilisateurs dans la base de données. Le fait que j'ai mis les mêmes noms peut poser problème (au niveau de l'appli je veux dire) ?

    En tout cas merci pour l'aide apportée jusque-là

  9. #9
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    salut,

    ta configuration doit être celle ci :

    Contexte de JAAS : jdbcRealm
    JNDI: jdbc/framenet
    Table d'utilisateurs : v_users
    Colonne de noms utilisateur : User
    Colonne de mots de passe : Password
    Table de groupes : v_users
    Colonne de noms de groupes : Name
    Algorithme condensé : MD5
    Tout le reste est vide. Mais si tu veux, tu peux directement créer ton realm dans ton fichier domain.xml situé sous ${GLASSFISH_HOME}/glassfish/domains/domain1/config (si tu utilises le domain domain1 bien sur).

    Ensuite dans ce fichier, tu recherches le nom de ton realm que tu trouveras dans un bloc <auth-realm />. Tu vires tout ce bloc et tu remplaces par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      <auth-realm name="le-nom-de-ton-realm" classname="com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm">
              <property name="digest-algorithm" value="MD5"></property>
              <property name="user-name-column" value="User"></property>
              <property name="password-column" value="Password"></property>
              <property name="group-name-column" value="Name"></property>
              <property name="group-table" value="v_users"></property>
              <property name="user-table" value="v_users"></property>
              <property name="datasource-jndi" value="jdbc/framenet"></property>
              <property description="null" name="jaas-context" value="jdbcRealm"></property>
    </auth-realm>
    tu relances Glassfish et normalement c'est bon (n'oublies pas de mettre le nom de ton realm dans la propriété name).

    Maintenant quelques conseils/explications en vrac

    • par convention, on ne met pas de majuscules au champs des BDD, vaut mieux écrire user plutôt que User donc pour éviter les problème de casse.
    • un utilisateur correspond à une personne/application unique comme vigrid ou thor alors qu'un groupe correspond si l'on peut dire à une caractéristique commune à plusieurs utilisateurs (un groupe peut cependant, même si cela n'a aucun sens contenir qu'un seul utilisateur). Par exemple le groupe "homme" contiendra tous tes utilisateurs. Dans ton cas actuel, tu as 4 utilisateurs et 4 groupes, un par utilisateur donc tu pourrais te passer finalement de groupes. A noter, et c'est l'intérêt des groupes, qu'un utilisateur peut appartenir à plusieurs groupes. Dans ta table principal_roles (que je renommerais en users_groupes personnellement) si tu rajoutes l'enregistrement (1, 4) tu verras dans ta vue que vigrid aura pour groupes "read" et "admin" et aura donc les autorisations pour ces 2 groupes (à mapper dans ton glassfish-web.xml).
    • je pense que c'est un test, mais ne met pas de password étant égal au MD5 de ton utilisateur comme c'est le cas
    • un rôle n'a de sens que dans ton code Java ou tu pourras utiliser par exemple la fonction HttpServletRequest.isUserInRole(String role) mais il n'existe PAS de fonction HttpServletRequest.isUserInGroup(String group). Pense comme ca : groupe->enregistrement en BDD, rôle->domaine Java. Ainsi, une fois tes groupes mappés à tes rôles, pour autoriser un ou des rôles à accéder à un EJB par exemple, il suffira d'utiliser l'annotation @RolesAllowed({"role1", "role2"}) devant la méthode ou la classe à sécuriser.
    • bonne chance

  10. #10
    Futur Membre du Club
    Inscrit en
    Novembre 2012
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2012
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Bravo, en effet en supprimant le champ Colonne du nom utilisateur de la table de groupe je peux utiliser les groupes sans problèmes. Et Loki ne fait plus planter toute l'appli, il ne peut tout simplement plus se connecter. C'est mieux

    J'ai regardé le fichier domain.xml, il était bien configuré (j'ai laissé le champ Algorithme de cryptage du mot de passe : MD5 car le vider ne changeait rien, et je recevais un message d'alerte sécurité), cela dit c'est toujours utile de savoir quel fichier modifier si par exemple le panneau d'administration est inaccessible.

    J'ai changé la base de donnée histoire de vérifier si les groupes marchent bien, maintenant la vue ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    User 	     	Password  	      	                                Name
    urd	                e63351a13e6564178e4654f96c4b45ed 	read
    verdandi	        f55f0409e2a9149f710da2be061a6337 	read
    skuld	                27dfc8eba5bc78c4eb5aa5332ec90bf8 	read
    eitri	                a903479b4b49b5d1f0710e1f934a9c75	annotate
    brokkr	        26b53469de3694d553c78861bebe1be6	annotate
    thor	                575e22bc356137a41abdef379b776dba 	vanguard
    jormungandr	c3dc28e2375ea6cfbff1d2044d2f44a2	vanguard
    odin	                e44985980c9d3c5d70b6a548b14d773a 	admin
    loki	                e64cfa3fd59e32df57003c7401f48c99	admin
    Et, c'est bizarre, je reçois un message d'erreur SEVERE: SEC1112: Cannot validate user [name] for JDBC realm pour skuld, verdandi, urd et odin. Difficile à comprendre
    Peut-être y a-t-il un lien, mais pour l'instant je ne vois pas, et il est un peu tard ici donc je vais laisser la nuit me porter conseil. Au pire je me dis que je vais commiter ce bout de code, mon collègue va l'essayer, et on verra si lui a ces messages intriguants.
    Si tu as une idée, elle est la bienvenue ! Mais peut-être que le test avec mon collègue pourra éclairer ça.

    D'autre part, tu a parlé des @rolesallowed, cependant j'ai lu sur un site l'avis d'un développeur qui m'a paru assez pertinent : il disait que c'était relativement frustrant pour un utilisateur read de voir des boutons inactifs, et qu'il était mieux que pour les "readers" le bouton "détruire la base de donnée" réservé aux admins ne soit tout simplement pas visible. Je suis assez d'accord, pour notre appli ça serait pas mal vu que le logiciel est destiné à des non-informaticiens. Limiter le nombre de boutons peut être une bonne idée. De plus je ne pense pas qu'il y ait de problème de sécurité, j'ai regardé avec firebug, les parties non-autorisées sont introuvables.
    En fait j'ai créé un bean qui peut vérifier les rôles de l'utilisateur, et je l'appelle dans la clause "rendered" des différents éléments à afficher. Si l'utilisateur possède le(s) rôle(s) requis, rendered=true, sinon rendered=false.
    C'est maladroit ? (tu me fais douter en parlant des @rolesallowed j'avoue )

    Post Scriptum : Pour l'instant je fais juste des tests, c'est pour cela que j'ai créé 4 groupes avec 4 utilisateurs, histoire de regrouper toutes les possibilités. De la même façon, le mot de passe est toujours le nom d'utilisateur pour l'instant, mais une fois que l'appli sera en ligne le panthéon nordique retournera vadrouiller dans la toundra
    J'ai essayé de mettre des noms sympathiques : les deux nains qui forgèrent le marteau de Thor sont les annotators, les nornes qui voient le destin sont les readers,... Ça met un peu de couleur dans mon tas de ligne de code


    En tout cas merci pour l'aide que tu m'as fournie, à cause de toi d'ici la fin de la semaine je vais devoir attaquer la partie XML de l'appli !

    Blague à part, merci beaucoup.

Discussions similaires

  1. [SP-2007] Commentez l'article sur l'émulation des roles dans Form Services !
    Par LefortLudovic dans le forum SharePoint
    Réponses: 1
    Dernier message: 25/08/2009, 14h27
  2. définir les roles dans mon web.config
    Par polo86 dans le forum ASP.NET
    Réponses: 0
    Dernier message: 25/05/2009, 15h23
  3. JDBC Realm avec mysql
    Par fabou3377 dans le forum Glassfish et Payara
    Réponses: 10
    Dernier message: 26/04/2009, 21h45
  4. rediriger sur absence de role dans le MemberShip
    Par zooffy dans le forum ASP.NET
    Réponses: 16
    Dernier message: 25/06/2008, 15h38
  5. [ Struts ] récupération des roles dans l'ActionForm
    Par rikunter dans le forum Struts 1
    Réponses: 3
    Dernier message: 21/04/2006, 10h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo