Protection répertoire utilisateur

Protection répertoire utilisateur - Java - Programmation

Marsh Posté le 01-10-2004 à 15:15:44    

Bonjour,
 
J'ai un petit soucis et je sais pas trop comment m'y prendre en fait ...
J'ai une appli sous tomcat où les utilisateurs ont des répertoires perso pour y stocker des données.
 
Je voudrais qu'un utilisateur ne puisse accéder qu'à son rep ou un groupe de répertoire qu'il gère. C'est-à-dire qu'on ne puisse pas accéder à un repertoire d'un autre utilisateur en entrant une url en dur.
 
Est-ce qu'il existe un moyen simple pour entreprendre cela ?
 
Merci
VoD

Reply

Marsh Posté le 01-10-2004 à 15:15:44   

Reply

Marsh Posté le 01-10-2004 à 17:36:29    

Est-ce que sous tomcat il y a un system comme sous apache , c'est-à-dire le fichier .htaccess ?

Reply

Marsh Posté le 01-10-2004 à 21:30:22    

L'accès au ressources du répertoire ne doit pas être fait en saisissant une URL directement dans le browser, sinon il n'y aura aucune sécurité.
 
Je pense que tes répertoires persos contenant les données doivent être situés hors de l'arborescence web (pour empêcher le cas du dessus) et que l'accès à ces ressources doit être fait en passant par une Action (au sens Struts) qui contrôle l'identité des users avant d'afficher les fichiers... T'auras une Action pour lister le répertoire, une autre pour télécharger un fichier (via Servlet/Action)...
 
C'est la théorie, après pour l'implémentation y'a du code en vue en fonction de l'état actuel de ton appli

Reply

Marsh Posté le 02-10-2004 à 01:34:38    

VoD a écrit :

Est-ce que sous tomcat il y a un system comme sous apache , c'est-à-dire le fichier .htaccess ?


regarde au niveau des security-constraint dans le web.xml
 
j'ai jamais trop touché à ca, mais je pense que c'est à ca que ca sert ...
 
maintenant, tu peux aussi gérer ca très facilement aver un filtre


Message édité par benou le 02-10-2004 à 01:34:48

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 04-10-2004 à 09:30:39    

benou a écrit :

regarde au niveau des security-constraint dans le web.xml
 
j'ai jamais trop touché à ca, mais je pense que c'est à ca que ca sert ...
 
maintenant, tu peux aussi gérer ca très facilement aver un filtre


 
En fait j'ai déjà testé en intégrant un truc du style :
 

Code :
  1. <security-constraint>
  2.   <web-resource-collection>
  3.   <web-resource-name>Protected Area</web-resource-name>
  4.     <url-pattern>/documents/*</url-pattern>
  5.     <http-method>GET</http-method>
  6.     <http-method>POST</http-method>
  7.     <http-method>DELETE</http-method>
  8.   </web-resource-collection>
  9.   <auth-constraint>
  10.     <role-name>OpacUser</role-name>
  11.   </auth-constraint>
  12. </security-constraint>
  13. <login-config>
  14.   <auth-method>BASIC</auth-method>
  15.   <realm-name>Admin</realm-name>
  16. </login-config>
  17. <welcome-file-list>
  18.   <welcome-file>/index.jsp</welcome-file>
  19. </welcome-file-list>


 
Mais en fait il me bloquait l'accès à toute les données, et donc çà j'ai pas trop compris. Alors que je voulais que juste le répertoire "documents" soit protégé.
 
Pour ta solution machinbidule1974, je pense qe cela ne va pas être possible d'envisager cela ... Trop de choses à changer mais merci quand même.
 
Je vais quand même tenter de continuer avec les security constraints car je pense que c'est la bonne voie.

Reply

Marsh Posté le 04-10-2004 à 09:37:29    

Je viens de trouver un petit tuto la dessus !
J'vous donne le lien , ca peut interesser du monde  
 
http://etudiant.univ-mlv.fr/~mrous [...] php?rub=20
 
 
J'vous tiens au courant en cas de succès ... ou de galère :)

Reply

Marsh Posté le 04-10-2004 à 10:02:32    

Bon ...
 
En fait j'voudrais utiliser une authentitification par formulaire.
Il existe un méthode à implémenter dans son web.xml de l'application  
 

Code :
  1. <login-config>
  2. <auth-method>FORM</auth-method>
  3. <form-login-config>
  4. <form-login-page>/login.jsp</form-login-page>
  5. <form-error-page>/error.jsp</form-error-page>
  6. </form-login-config>
  7. </login-config>


 
Et notre formulaire a cette gueule après  
 

Code :
  1. <form method="POST" action="j_security_check">
  2. Login : <input type="text" name="j_username">
  3. Mot de passe :<input type="password" name="j_password">
  4. <input type="submit" value="Entrer !"></td>
  5. <input type="reset" value="Annuler">
  6. </form>


 
Comme vous voyez , on  est obliger de passer en action j_security_check pour authentifier l'utilisateur via les realm.
 
Mon problème, c'est qu'à l'authentification d'un gars, je dois effectuer un traitement : implémentation de variables de session, redirection spécifique à son statut ... Comment est-il possible de mettre en oeuvre cela ?
 

Reply

Marsh Posté le 04-10-2004 à 10:36:52    

Ma propre expérience sur la mise en place de contraintes de sécurité sur une webapp.
 
Appli sous WebSphere.
 
Contrainte de sécurité positionnée sur les JSPs et les URLs en *.do via web.xml (comme t'as fait au-dessus)
 

  • Le user saisit une URL style http://localhost:8080/maWebApp/login.do
  • Le conteneur de servlet intercepte la requête et détermine que le user n'est pas loggé, comme il y a une contrainte de sécurité sur l'URL en *.do...
  • Il redirige vers le formulaire de connexion avec ses champs user/password
  • La soumission de ce formulaire appelle la servlet d'authentification j_security_check (Dans mon cas, le user/pwd était contrôlé par rapport à un annuaire LDAP d'entreprise).
  • Si l'authentification rate, le conteneur de servlets appelle une page qui doit être paramétrée dans web.xml et qui correspond au cas de l'authentification qui foire (/error.jsp chez toi).
  • Autrement, l'URL en http://localhost:8080/maWebApp/login.do est appelée après authentification du user. C'est dans cette action que tu dois positionner tes variables de session, rediriger le user vers une JSP selon son profil...


Tu peux récupérer le user saisi au login par request.getRemoteUser()


Message édité par machinbidule1974 le 04-10-2004 à 10:39:01
Reply

Marsh Posté le 04-10-2004 à 10:43:29    

machinbidule1974 a écrit :

C'est dans cette action que tu dois positionner tes variables de session, rediriger le user vers une JSP selon son profil...


 
Oui j'avais bien compris tout ce que tu explique au dessus, mais ca veut dire qu'il faut que je mette çà en place sur toute les pages existentes ?????
 
Aie aie aie c'est impossible LOL
 
On peut pas directement après qu'il ait fait la méthode j_security_check, appellé ma servlet  ? via une méthode javascript ou autre ?
 

Reply

Marsh Posté le 04-10-2004 à 11:00:01    

Personallement, je pense que d'ici peu, j'aurai le même genre de chose à faire, à savoir :
identification d'un utilisateur (système déja en place)
lecture de ses droits
accès à certains répertoires (lister et accèder aux ressources) en fonction des droits
Pour intégrer ça à mon appli, ce sera surement + simple que j'implémente ma propre servlet, qui servira les dits répertoire et fichiers (qui ne seront donc pas des sous répertoires de l'appli web).


Message édité par El_gringo le 04-10-2004 à 11:00:51
Reply

Marsh Posté le 04-10-2004 à 11:00:01   

Reply

Marsh Posté le 04-10-2004 à 11:14:14    

El_gringo a écrit :

Personallement, je pense que d'ici peu, j'aurai le même genre de chose à faire, à savoir :
identification d'un utilisateur (système déja en place)
lecture de ses droits
accès à certains répertoires (lister et accèder aux ressources) en fonction des droits
Pour intégrer ça à mon appli, ce sera surement + simple que j'implémente ma propre servlet, qui servira les dits répertoire et fichiers (qui ne seront donc pas des sous répertoires de l'appli web).


 
En fait actuellement c'est ce que j'ai fait, c'est à dire implémenter ma propre servlet. Mais mon soucis est qu'un utilisateur peut aller voir les données d'un autre en tapant une url brute.
 
Après 2 choses, c'est impossible que je fasse un test sur chaque pages individuellement vu que j'en ai des centaines et des centaines par utilisateur. Donc je cherche, je cherche ...

Reply

Marsh Posté le 04-10-2004 à 11:43:18    

Ben, comment tu occtrois à tel ou tel utilisateur un droit sur un répertoire ?

Reply

Marsh Posté le 04-10-2004 à 11:49:22    

VoD a écrit :

En fait actuellement c'est ce que j'ai fait, c'est à dire implémenter ma propre servlet. Mais mon soucis est qu'un utilisateur peut aller voir les données d'un autre en tapant une url brute.
 
Après 2 choses, c'est impossible que je fasse un test sur chaque pages individuellement vu que j'en ai des centaines et des centaines par utilisateur. Donc je cherche, je cherche ...


 
Je suis pas sûr d'avoir tout compris à ton problème...
 
Mais dans ton URL, tu ne dois pas saisir de données identifiant ton user autrement c'est très facile de gruger ton appli pour aller voir d'autres données que les siennes. Tu dois récupérer le user de l'utilisateur depuis un objet stocké dans sa session http.
 
Si malgré tout, tu es obligé de faire comme ça, tu dois contrôler avant d'effectuer toute action que ton user est bien celui qu'il prétend être: vérifier le paramètre saisi dans l'URL par rapport à une donnée stockée en session...
 
Pour éviter d'avoir à mettre en place un contrôle sur les droits d'accès à chaque JSP, il faut factoriser ce code de contrôle d'accès dans ta servlet "en amont" des JSPs (Modèle MVC2 type Struts)
 
Les utilisateurs ne doivent jamais accéder directement aux JSPs en saisissant une URL, la servlet d'action doit servir de point d'entrée à ton application. C'est bcp + simple d'y placer le code de contrôle des droits (exécution / accès)


Message édité par machinbidule1974 le 04-10-2004 à 11:50:10
Reply

Marsh Posté le 04-10-2004 à 12:09:39    

El_gringo a écrit :

Ben, comment tu occtrois à tel ou tel utilisateur un droit sur un répertoire ?


 
dans ma BDD il a un nom de répertoire qu'y lui est attribué
 

machinbidule1974 a écrit :

Mais dans ton URL, tu ne dois pas saisir de données identifiant ton user autrement c'est très facile de gruger ton appli pour aller voir d'autres données que les siennes. Tu dois récupérer le user de l'utilisateur depuis un objet stocké dans sa session http.


 
Nan nan j'ai une page de login ou après je récupère les données et sotcke le tout dans des variables de sessions.
A partir de cela je peux savoir à qui appartient tel ou tel repertoire.
 

machinbidule1974 a écrit :


Si malgré tout, tu es obligé de faire comme ça, tu dois contrôler avant d'effectuer toute action que ton user est bien celui qu'il prétend être: vérifier le paramètre saisi dans l'URL par rapport à une donnée stockée en session...


 
Le problème vis à vis de cela, c'est que j'ai souvent des PDF dans le repertoire des users, donc je ne peux faire aucun controle la dessus.
 
Par ex, si un petit malin tape : http://monsite.com/repUser/toto/titi.pdf et que ce rep ne lui appartient pas, il y accede qd même.
 
C'est pour cela que j'aimerai faire un style d'autenthification comme j'ai cité précédemment, tout en ayant accès à ma servlet.

Reply

Marsh Posté le 04-10-2004 à 12:12:49    

Je serai toi, je placerai tes répertoires contenant les PDFs hors de l'arborescence web et je servirai le fichier uniquement si le user a le droit d'accès via une action.

Reply

Marsh Posté le 04-10-2004 à 12:16:01    

VoD a écrit :

dans ma BDD il a un nom de répertoire qu'y lui est attribué


 
Ben voila, alors c'est pas compliqué de savoir (et tester) si tel répertoire est autorisé à tel utilisateur

Reply

Marsh Posté le 04-10-2004 à 12:17:12    

machinbidule1974 a écrit :

Je serai toi, je placerai tes répertoires contenant les PDFs hors de l'arborescence web et je servirai le fichier uniquement si le user a le droit d'accès via une action.


 
C'est ce que je te disais de faire avec une servlet à toi : servir le ou les répertoire(s) autorisé(s), mais en ne les plaçant pas dans le répertoire de ta web app

Reply

Marsh Posté le 04-10-2004 à 12:17:57    

machinbidule1974 a écrit :

Je serai toi, je placerai tes répertoires contenant les PDFs hors de l'arborescence web et je servirai le fichier uniquement si le user a le droit d'accès via une action.


 
 
C'est-à-dire ? En dehors de webapps/monAppli ?

Reply

Marsh Posté le 04-10-2004 à 12:19:29    

VoD a écrit :

C'est-à-dire ? En dehors de webapps/monAppli ?


 
Hors du répertoire WEB-INF

Reply

Marsh Posté le 04-10-2004 à 12:19:37    

ok j'vais testé çà.
et normalement les autres clients ne pourront pas y accéder via une url en dure avec ce moyen ?

Reply

Marsh Posté le 04-10-2004 à 12:19:58    

Oops, j'ai dit une bêtise. Je viens de vérifier, tes ressources ne doivent pas être dans le répertoire qui sert de racine à ta webapp. Par exemple "Web Content" sous WSAD v5 ou "Web Application" v4.
 
Les ressources dans WEB-INF ne sont pas accessibles via l'URL
 
Mea culpa


Message édité par machinbidule1974 le 04-10-2004 à 12:22:16
Reply

Marsh Posté le 04-10-2004 à 12:20:23    

machinbidule1974 a écrit :

Hors du répertoire WEB-INF


 
Actuellement ils ce sont pas dans le rep WEB-INF, mais sur la racine de l'application

Reply

Marsh Posté le 04-10-2004 à 12:22:31    

cf mon post au dessus

Reply

Marsh Posté le 04-10-2004 à 12:28:28    

Ha ok ok ok !
Bien cool çà !
 
Donc en gros je place mes docs dans le rep WEB-INF
Après comment je leurs donnent accès aux fichiers si tu me dit que C pas accessible ?  
C'est juste via url ?  
Si je mets un lien à un users ca passe ?

Reply

Marsh Posté le 04-10-2004 à 12:33:13    

VoD a écrit :

Ha ok ok ok !
Bien cool çà !
 
Donc en gros je place mes docs dans le rep WEB-INF
Après comment je leurs donnent accès aux fichiers si tu me dit que C pas accessible ?  
C'est juste via url ?  
Si je mets un lien à un users ca passe ?


 
Ben non, justement, on vient de te dire que c'est pas accessible par URL qd tu mets dans ce répertoire. C pour ça que je te disais d'écrire toi même une servlet qui va rendre disponible via URL, uniquement le contenu des répertoires qu'il faut, aux utilisateurs qu'il faut. Pour "servir" des répertoires, dossier, ça dépend ce que tu veux pouvoir en faire, mais c le même principe que pr ttes les servlets HTTP.

Reply

Marsh Posté le 04-10-2004 à 12:37:40    

Tu peux placer tes fichiers dans WEB-INF ou n'importe quel autre répertoire plus approprié comme C:\MonAppliPDF...
 
Pour qu'un user accède à ses PDFs, il devra utiliser une URL comme http://localhost:8080/monAppliWeb/ [...] chier.pdf.
 
Ce qui va lancer une action ConsulterPDF, laquelle va vérifier que le user a bien le droit d'accéder au PDF et envoyer dans le flux de sortie de la HttpServletResponse le PDF sous forme binaire (Méthode response.getOutputStream().write())...
 

Reply

Marsh Posté le 04-10-2004 à 12:38:29    

oui oui gringo j'avais bien capté le principe =)
Mon bide a fin ptet pour ca que me suis mal interprété !
 
Bon j'tente tout ca apres bouffé !
 
Merci pour votre aide

Reply

Marsh Posté le 04-10-2004 à 12:40:15    

machinbidule1974 a écrit :

Tu peux placer tes fichiers dans WEB-INF ou n'importe quel autre répertoire plus approprié comme C:\MonAppliPDF...
 
Pour qu'un user accède à ses PDFs, il devra utiliser une URL comme http://localhost:8080/monAppliWeb/ [...] chier.pdf.
 
Ce qui va lancer une action ConsulterPDF, laquelle va vérifier que le user a bien le droit d'accéder au PDF et envoyer dans le flux de sortie de la HttpServletResponse le PDF sous forme binaire (Méthode response.getOutputStream().write())...


 
 
OK pour le principe , no soucy , mais euh euh c'est quoi un .do ??  :heink:

Reply

Marsh Posté le 04-10-2004 à 13:29:01    

Est-ce-que tu utilises Struts pour ta webapp ?
 
Autrement, ".do", c'est le suffixe apposé à toutes URIs d'une webapp développée avec Struts, c'est une convention.


Message édité par machinbidule1974 le 04-10-2004 à 13:29:46
Reply

Marsh Posté le 04-10-2004 à 13:39:16    

nan j'utilises pas Struts et je t'avouerai que je connais même pas.
Pour çà que je connais pas ce fameux .do ;)

Reply

Marsh Posté le 04-10-2004 à 13:48:27    

Par curiosité, est-ce-qu'il est possible d'accéder à une JSP en saisissant juste son URL (en *.jsp) dans le navigateur ? Et est-ce-que tes JSPs intègrent du code java permettant de récupérer des données en base ?


Message édité par machinbidule1974 le 04-10-2004 à 13:49:21
Reply

Marsh Posté le 04-10-2004 à 14:02:30    

oui tout à fait

Reply

Marsh Posté le 04-10-2004 à 14:03:28    

Et ca te permet de faire quoi en gros les Struts ?
Leurs principals atouts ?
 
Pour savoir si C interessant que je me lance là dedans ou non

Reply

Marsh Posté le 04-10-2004 à 14:43:58    

Ca te permet de bénéficier d'un framework "MVC de type 2" séparant clairement les aspects logique métier, présentation et contrôle de l'application.
 
Le gros avantage, c'est qu'il n'y a qu'une servlet dans l'application qui sert de point d'entrée, toutes le requêtes sont traitées par cette servlet (impossible de la bypasser). Ainsi il est facile de mettre en place une gestion de la confidentialité avec ce type de framework: il suffit de modifier la servlet d'action.
 
Les JSPs ne sont jamais accédées directement (par saisie d'une URL dans le navigateur), elles ne contiennent que du code pour faire la mise en page (itérations...) et aucun accès aux données. Conséquence: il est impossible d'appeler une JSP à laquelle tu n'as pas accès car elle ne possèdera pas les données pour réaliser l'affichage.
 
Schématiquement:
 
1) Saisie d'une URL en *.do dans le browser
2) Appel de la servlet d'action qui fait correspondre l'URI appelée à une Action donnée
3) Appel de la logique de l'Action (accès à la base de données, création de beans de présentation rattachés à la requête)
4) Redirection de la requête vers la JSP qui va formatter le résultat du traitement en utilisant les beans de données instanciés en amont (étape 3).
5) Envoi du HTML généré au browser
 
Apprendre Struts, ce n'est pas une perte de temps du tout.
 
Dans l'état actuel de ton appli (ce que j'en ai compris), si tu veux mettre en place une politique de sécurité, comme il y a autant de points d'entrée dans la webapp que de JSPs appelables, il faut répéter n fois ta modif dans chaque JSP pour contrôler les droits d'accès...

Reply

Marsh Posté le 04-10-2004 à 15:07:41    

machinbidule1974 a écrit :

Dans l'état actuel de ton appli (ce que j'en ai compris), si tu veux mettre en place une politique de sécurité, comme il y a autant de points d'entrée dans la webapp que de JSPs appelables, il faut répéter n fois ta modif dans chaque JSP pour contrôler les droits d'accès...


 
C'est bien ce dont j'ai peur ...
Je vais quand même regarder les Struts et essayer de'approfondir au niveau des contraites de sécurité

Reply

Marsh Posté le 04-10-2004 à 15:09:43    

Le problème, c'est que ton appli est déjà développée et que c'est trop tard pour te mettre à Struts (il va falloir porter ton appli vers Struts). De +, c'est une "technique" assez lourde à apprendre et pas forcément nécessaire si le projet est trop petit.

Reply

Marsh Posté le 04-10-2004 à 15:23:07    

Clair je pense que je vais laché l'affaire pour cela sachant que c'est juste pour un problème et que plus de 70% de mon appli est bouclée.
Mais j'y penserai pour une autre fois, je vais un peu me documenté la dessus

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed