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

Tomcat et TomEE Java Discussion :

Authentification LDAP par Tomcat


Sujet :

Tomcat et TomEE Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 84
    Points : 65
    Points
    65
    Par défaut Authentification LDAP par Tomcat
    Salut,
    J'ai crée un petit projet de test pour essayer de faire une appli web avec authentification suivant un annuaire ldap, mais ça ne marche pas.
    Le problème étant qu'il n'y aucune prise en compte des paramètres de sécurité, c'est à dire que je peux accéder à toute les pages de mon appli comme si de rien n'était.
    C'est un projet de test, donc il y a pas grand chose, et je vais tout mettre histoire de passer à coté de rien.
    Alors j'ai juste trois jsp (identification, error, et test), test étant la ressource à accéder une fois qu'on est identifié. J'ai pas fait de servlet parceque j'ai la flemme & que c'est juste un test.
    error.jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <html>
    <head>
    <%
    	response.setHeader("Cache-Control", "no-cache"); //HTTP 1.1
    	response.setHeader("Pragma", "no-cache"); //HTTP 1.0
    	response.setDateHeader("Expires", 0); //prevents caching at the proxy server
    %>
    </head>
    <body>
    <h1>erreur</h1>
    </body>
    </html>
    identification.jsp :
    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
    <html>
    <head>
    <%
    	response.setHeader("Cache-Control", "no-cache"); //HTTP 1.1
    	response.setHeader("Pragma", "no-cache"); //HTTP 1.0
    	response.setDateHeader("Expires", 0); //prevents caching at the proxy server
    %>
    </head>
    <body>
     <form method="POST" action="j_security_check">
        <table>
          <tr>
            <td>Login :</td>
            <td><input type="text" name="j_username"></td>
          </tr>
          <tr>
            <td>Mot de passe :</td>
            <td><input type="password" name="j_password"></td>
          </tr>
          <tr>
            <td><input type="submit" value="Entrer"></td>
            <td><input type="reset" value="Annuler"></td>
          </tr>
        </table>
      </form>
     
    </body>
    </html>
    test.jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <html>
    <head>
    <%
    	response.setHeader("Cache-Control", "no-cache"); //HTTP 1.1
    	response.setHeader("Pragma", "no-cache"); //HTTP 1.0
    	response.setDateHeader("Expires", 0); //prevents caching at the proxy server
    %>
    </head>
    <body>
    <h1>blabla</h1>
    </body>
    </html>
    Ensuite les fichiers de conf :
    web.xml (complet)
    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
    <web-app>
     <security-constraint>
    		<display-name>Tomcat Server Configuration Security 
    			Constraint</display-name>
    		<web-resource-collection>
    			<web-resource-name>Protected Area</web-resource-name>
    			<!-- Define the context-relative URL(s) to be protected -->
    			<url-pattern>/*</url-pattern>
    			<http-method>GET</http-method>
    			<http-method>POST</http-method>
    		</web-resource-collection>
    		<auth-constraint>
    			<role-name>*</role-name>
    		</auth-constraint>
    		<user-data-constraint>
    			<transport-guarantee>CONFIDENTIAL</transport-guarantee>
    		</user-data-constraint>
     </security-constraint>
    	<!-- Login configuration uses form-based authentication -->
     <login-config>
    		<auth-method>FORM</auth-method>
    		<realm-name>Form-Based Authentication
    			</realm-name>
    		<form-login-config>
    			<form-login-page>/identification.jsp</form-login-page>
    			<form-error-page>/error.jsp</form-error-page>
    		</form-login-config>
     </login-config>
     <!-- Security roles referenced by this web application -->
     <security-role>
    		<!--
    		<description> The role that is required to log in to the 
    		       Administration Application </description>
    		-->
    		<role-name>*</role-name>
     </security-role>
    </web-app>
    conf.xml (la partie intéressante)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     <Realm   className="org.apache.catalina.realm.JNDIRealm" debug="99"
    	connectionURL="ldap://XX.X.XX.XXX:389"
    	userBase="ou=XXX,dc=XXXX,dc=XX"
    	userSubtree="true"
    	userSearch="(uid={0})"
     />
    Ps : c'est la première fois que je me sers de ldap & de tomcat pour une identification, normalement je fais ça directement dans mon code métier via une base accessible par des requêtes sql.
    J'ai tenté de remplir le conf.xml correctement, avec ces infos, fournies par mon chef, mais je me demande si la configuration est bien faite (même si ce n'est qu'un problème accessoire, puisque je devrais tout de même tomber sur la page de login)
    Ici les infos fournies :
    voici le query que on utilise

    ldap://XX.X.XX.XXX/DC=XXX,DC=XXX?XXX?XXX?(objectClass=XXX)
    Un dernier point, quand je me rend sur ma page de login manuellement, en tapant son adresse dans la barre de naviguation, et que je valide le formulaire, je tombe sur une page d'erreur type
    Etat HTTP 404 - /ldap_test/j_security_check

    type Rapport d'état

    message /ldap_test/j_security_check

    description La ressource demandée (/ldap_test/j_security_check) n'est pas disponible.
    Voila, j'ai fini mon pavé, si quelqu'un pouvait jeter un coup d'oeil je lui en serais très reconnaissant.
    Merci d'avance.
    Bdloul

  2. #2
    Membre habitué Avatar de Mygush
    Inscrit en
    Juin 2007
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 226
    Points : 175
    Points
    175
    Par défaut
    Salut,
    Je ne sais pas si ça correspond réellement à ton problème mais voici le paramétrage que j'ai pour mon appli :
    fichier Server.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <Realm className="org.apache.catalina.realm.JNDIRealm" debug="99"
    			connectionURL="ldap://serveur.monDomaine:389"
    			connectionName=userLdap
    			connectionPassword=pwd
    			userBase=ton groupe utilisateur
    			userSubtree="true"
    			userSearch="(sAMAccountName={0})"
    			roleBase=role utilisateur
    			roleName="CN"
    			roleSearch="(member={0})"
    			roleSubtree="true"
    		 />
    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
    <security-constraint>
            <display-name>Tomcat Server Configuration Security Constraint</display-name>
            <web-resource-collection>
                <web-resource-name>MonAppli</web-resource-name>
                <url-pattern>/faces/*</url-pattern>
                <http-method>GET</http-method> 
                <http-method>POST</http-method>
            </web-resource-collection>
            <auth-constraint>
                <role-name>Groupe LDAP</role-name>
            </auth-constraint>
        </security-constraint>
        
        <login-config> 
            <auth-method>FORM</auth-method>
            <realm-name>Form-Based Authentication</realm-name>
            <form-login-config> 
                <form-login-page>/login.jsp</form-login-page>
                <form-error-page>/login.jsp</form-error-page>
            </form-login-config> 
        </login-config> 
        
        <security-role>
            <description>The role that is required to log in to the Manager Application</description>
            <role-name>Groupe LDAP</role-name>
        </security-role>
    Ma page jsp:
    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
    <table>
                            <tr>
                                <td width="417px"><h6>Login :</h6></td>
                                <td width="417px">
                                    <input type="text" name="j_username">
                                </td>
                            </tr>
                            <tr>
                                <td><h6>Mot de passe :</h6></td>
                                <td>
                                    <input type="password" name="j_password">
                                </td>
                            </tr>
                            <tr><td>&nbsp;</td></tr>
                            <tr>
                                <td align="right">
                                    <input type="reset" value="Annuler">
                                </td>
                                <td>
                                    <input type="submit" value="Valider">
                                </td>
                            </tr>
                        </table>
    Voila avec cette config, seul les personnes membres du Groupe LDAP dans ton LDAP sont autorisées à se connecter à l'appli !
    Désolé pour la présentation du code, je la balance un peu brut de pomme mais je suis assez pressé
    En espérant que cela puisse t'aider

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 84
    Points : 65
    Points
    65
    Par défaut
    Ouais ca m'aide un peu, en fait le truc sur lequel je galère c'est que je ne connais pas grand chose à ldap, et les informations que me communiquent mon boss sont pour le moins "réduite".
    Je me permets donc de te poser quelque questions sur ton Server.xml, sachant que j'ai déja lu une blinde de doc & de tutos, mais je profite d'avoir un interlocuteur qui y connaisse quelque chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    connectionName=userLdap
    connectionPassword=pwd
    Est ce que ces champs représentent le coupe login/mdp nécessaire pour se connecter à l'annuaire ldap (un peu comme une bdd protégée à laquelle on se connecterait avec un couple type admin/admin) ou juste les noms des champs de l'annuaire qui correspondent aux user/mdp du groupe d'utilisateur?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    userSearch="(sAMAccountName={0})"
    Je ne comprends vraiment pas de champ, que ce soit au niveau de la valeur ou du "samaccountname".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    roleSearch="(member={0})"
    Pareil pour ce champ.

    Pour te dire, voilà les infos qui m'ont été communiqué :
    - Nom d'hôte : XX-XXXXX
    -ip : XX.X.XX.XXX
    - Port : XXX
    - SSL oui/non : non
    - DN de base : DC=XXXX,DC=XXX
    - Un utilisateur avec les droits administrateurs : XXXX/XXXX

    voila l'URL que j'utilise à côté :

    ldap://XX.X.XX.XXX/DC=XXXX,DC=XXX?XXX?XXX?(objectClass=XXX)

    Fin bref, j'ai fait trois ou quatre tutos différents avec à chaque fois un fichier de conf & des champs différents à remplir, et ça ne fonctionne toujours pas.
    Tout ca pour dire que si tu peux répondre à mes questions, ça m'aiderait beaucoup.
    Merci d'avance.
    Cordialement,
    Bdloul

  4. #4
    Membre habitué Avatar de Mygush
    Inscrit en
    Juin 2007
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 226
    Points : 175
    Points
    175
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    connectionName=userLdap
    connectionPassword=pwd
    C'est effectivement un utilisateur ayant les droits de lecture de ton annuaire LDAP. Ca peut être n'importe quel utilisateur présent dans ton LDAP. Pour ma part j'ai créé un utilisateur qui a pour seul fonction que de parcourir mon LDAP car le défaut c'est que le mot de passe est en clair dans ton Server.xml.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    userSearch="(sAMAccountName={0})"
    Ce champ me permet de chercher dans ton LDAP l'utilisateur correspondant au login saisi à l'ouverture de ton application. Pour ma part, c'est l'équivalent du login windows. Tu peux également utiliser le champ distinguishedName qui te permet de chercher le nom unique de ton utilisateur avec les 'CN' et 'OU'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    roleSearch="(member={0})"
    Ce champ me permet tout simplement de vérifier si l'utilisateur, une fois la connexion validée, fait partie du groupe déclaré en tant que <rolename> dans le fichier web.xml. Le lien est fait avec le champ roleName = "CN", cela veut dire vérifie si le rôle déclaré dans web.xml = mon groupe "CN=mon groupe;OU......"
    Il faut bien évidemment que la syntaxe soit la même côté web.xml et côté annuaire.
    Voilà j'espère que ça t'aide un peu car c'est vrai que j'ai pas mal galéré moi aussi pour trouver la bonne config

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 84
    Points : 65
    Points
    65
    Par défaut
    Voila mon /conf/server.xml que j'ai fait en utilisant les infos que tu m'as filé & d'autre trucs récupéré sur le net (à part l'userSearch que j'avoue ne pas comprendre, même avec ton explication).
    J'ai zappé les rôles vu que ce n'est pas un critère d'identification dans mon cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <Realm className="org.apache.catalina.realm.JNDIRealm"
    debug="99"
    connectionURL="ldap://XX.X.XX.XXX:XXX"
    connectionName="cn=XXXX,ou=XXX,dc=XXXX,dc=XX"
    connectionPassword="YYYYYYYY"
    userBase="DC=XXXX,DC=XXXX"
    userSubtree="true"
    userSearch="(sAMAccountName={0})"/>
    Fin bref ça ne marche pas, l'authentification fail en permanence, & je n'ai pas d'erreur sur la console tomcat.
    Une idée?
    Merci d'avance,
    Bdloul

  6. #6
    Membre habitué Avatar de Mygush
    Inscrit en
    Juin 2007
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 226
    Points : 175
    Points
    175
    Par défaut
    Alors peut-être que pour toi il faut que tu utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    userSearch="(uid={0})"/>
    Dans mon cas, je passe par un ActiveDirectory qui utilise sAmaccountName comme champ désignant le login windows.
    Ensuite essaies de rajouter ton OU dans ton userBase car je pense que ton utilisateur n'est pas trouvé car tu n'es pas sur la bonne branche de ton LDAP.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    userBase="OU=LCM,DC=LCMADAM,DC=NET"

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 84
    Points : 65
    Points
    65
    Par défaut
    Donc pour usersearch, <uid> ou <sMaccountName> désignent le nom du "champ" ou sont marqué les noms des utilisateurs? Et le "=0" est là pour faire la relation entre j_login & userSearch?

  8. #8
    Membre habitué Avatar de Mygush
    Inscrit en
    Juin 2007
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 226
    Points : 175
    Points
    175
    Par défaut
    Tu as tout compris, il faut donc trouver la bonne syntaxe et surtout vérifier le contenu de ton champ LDAP.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 84
    Points : 65
    Points
    65
    Par défaut
    Merci beaucoup, j'ai réussi à faire marcher l'authentification.
    En fait, mon champ était
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    userSearch="(name={0})"
    Par contre, je me permets de te demander un dernier truc.
    Maintenant que l'authentification marche, les accès limités de tomcat (/manager par exemple) sont accessible avec les accès ldap que j'ai configuré. Existe il un moyen de laisser la conf tomcat se gérer toute seul avec /conf/tomcat-users.xml?
    En tout cas merci beaucoup, ca fait une bonne semaine que j'étais bloqué dessus, et je commençais à en avoir par dessus la tête.

  10. #10
    Membre habitué Avatar de Mygush
    Inscrit en
    Juin 2007
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 226
    Points : 175
    Points
    175
    Par défaut
    J'ai pas mal galéré moi aussi alors si je peux filer un coup de main c'est bien naturel .
    Pour répondre à ta question, tu peux utiliser la classe CombinedRealm qui te permet d'utiliser plusieurs moyens d'authentification et donc pour ton cas garder un utilisateur Tomcat dans ton tomcat-user.xml.
    Je te pose ici un code vraiment à titre d'exemple pour voir le principe mais j'espère que ça pourra t'aider !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <Realm className="org.apache.catalina.realm.CombinedRealm" >
       <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                 resourceName="UserDatabase"/>
       <Realm className="org.apache.catalina.realm.JNDIRealm"
                ...........................
                ........................... />
    </Realm

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 84
    Points : 65
    Points
    65
    Par défaut
    Bah le problème c'est ce que tu me donne c'est un moyen de multiplier les types d'authentification disponibles. C'est à dire que dans mon appli je pourrai m'identifier avec les users venant de ldap ET les users de tomcat-xml. Je recherche un moyen de séparer les deux database. Je vais continuer à chercher sur l'internet et je posterai la solution si je la trouve.
    Merci quand même.
    Bdloul

  12. #12
    Membre habitué Avatar de Mygush
    Inscrit en
    Juin 2007
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 226
    Points : 175
    Points
    175
    Par défaut
    Du coup c'est moi qui pause une question, pourquoi conserves-tu tes utilisateurs de ton user.xml puisque tu t'authentifies via LDAP ?

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 84
    Points : 65
    Points
    65
    Par défaut
    Les users s'authentifient sur mes pages web protégées par ldap, mais je voudrais pouvoir utiliser le tomcat-users pour accéder au tomcat manager. Il y a un problème de rôle à mon avis, qui fait que même avec un log de ldap valide, je n'ai pas accès au tomcat-manager (message d'erreur : vous n'avez pas les droits après un log réussi).

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 84
    Points : 65
    Points
    65
    Par défaut
    Je me permets de remonter le post pour savoir si quelqu'un a déja fait une authentification tomcat en passant par ldap en se servant des rôles?

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 80
    Points : 50
    Points
    50
    Par défaut
    Bonjour,

    les realm peuvent être présents sur différents niveaux :

    ENGINE
    HOST
    CONTEXT

    Il suffit que tu définisses un REALM au niveau qui te convient (le plus bas ayant la préemption sur le niveau supérieur) pour pouvoir ensuite changer le comportement d'authentification.

    Pour ma part, j'ai laissé la conf standard au niveau de l'engine pour accéder au manager et j'ai défini un autre host avec une authentification LDAP pour mon application.

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/11/2014, 16h40
  2. Monter un disque dur distant par authentification LDAP
    Par g_escande81 dans le forum Serveurs (Apache, IIS,...)
    Réponses: 0
    Dernier message: 24/10/2014, 14h32
  3. Authentification logiciel par le biais de groupe LDAP
    Par SanTa62 dans le forum Applications et environnements graphiques
    Réponses: 0
    Dernier message: 27/05/2009, 11h57
  4. [Config] [XIR2] Mettre LDAP par defaut dans l'authentification Infoview
    Par bmasimo dans le forum Administration-Migration
    Réponses: 12
    Dernier message: 15/04/2009, 10h53

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