Précédent   Forum des professionnels en informatique > Java > Serveurs, conteneurs, et Java EE > Tomcat
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/02/2012, 16h09   #1
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 82
Points : 36
Points : 36
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 :
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 :
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 :
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 :
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 :
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 :
Citation:
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
Citation:
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
Bdloul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 17h27   #2
Membre du Club
 
Avatar de Mygush
 
Inscription : juin 2007
Messages : 169
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 169
Points : 69
Points : 69
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 :
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 :
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 :
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
Mygush est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/02/2012, 09h47   #3
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 82
Points : 36
Points : 36
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 :
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 :
userSearch="(sAMAccountName={0})"
Je ne comprends vraiment pas de champ, que ce soit au niveau de la valeur ou du "samaccountname".

Code :
roleSearch="(member={0})"
Pareil pour ce champ.

Pour te dire, voilà les infos qui m'ont été communiqué :
Citation:
- 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
Bdloul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 10h11   #4
Membre du Club
 
Avatar de Mygush
 
Inscription : juin 2007
Messages : 169
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 169
Points : 69
Points : 69
Code :
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 :
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 :
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
Mygush est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 12h59   #5
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 82
Points : 36
Points : 36
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 :
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
Bdloul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 15h06   #6
Membre du Club
 
Avatar de Mygush
 
Inscription : juin 2007
Messages : 169
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 169
Points : 69
Points : 69
Alors peut-être que pour toi il faut que tu utilises
Code :
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 :
userBase="OU=LCM,DC=LCMADAM,DC=NET"
Mygush est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 15h22   #7
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 82
Points : 36
Points : 36
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?
Bdloul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 16h12   #8
Membre du Club
 
Avatar de Mygush
 
Inscription : juin 2007
Messages : 169
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 169
Points : 69
Points : 69
Tu as tout compris, il faut donc trouver la bonne syntaxe et surtout vérifier le contenu de ton champ LDAP.
Mygush est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 16h52   #9
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 82
Points : 36
Points : 36
Merci beaucoup, j'ai réussi à faire marcher l'authentification.
En fait, mon champ était
Code :
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.
Bdloul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 11h38   #10
Membre du Club
 
Avatar de Mygush
 
Inscription : juin 2007
Messages : 169
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 169
Points : 69
Points : 69
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 :
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
Mygush est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 10h04   #11
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 82
Points : 36
Points : 36
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
Bdloul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 10h48   #12
Membre du Club
 
Avatar de Mygush
 
Inscription : juin 2007
Messages : 169
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 169
Points : 69
Points : 69
Du coup c'est moi qui pause une question, pourquoi conserves-tu tes utilisateurs de ton user.xml puisque tu t'authentifies via LDAP ?
Mygush est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2012, 11h13   #13
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 82
Points : 36
Points : 36
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).
Bdloul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2012, 16h15   #14
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 82
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 82
Points : 36
Points : 36
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?
Bdloul est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h19.


 
 
 
 
Partenaires

Hébergement Web