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

Sécurité Java Discussion :

probleme avec jaas et les permissions


Sujet :

Sécurité Java

  1. #1
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut probleme avec jaas et les permissions
    salut j'ai essayé de gérer la notion des permission avec jaas à l'aide d'un simple exemple
    voici ma classe de test:
    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
     
    public static void main(String[] args) {
    		 boolean result = false;
    		    try 
    		    {
    		    	//-Djava.security.auth.login.config=C:\JAAS\src\fileLogin.config
    		      System.setProperty("java.security.auth.login.config", "c:\\MonitoringJMX.config");
    		      LoginCallback loginCallback=new LoginCallback("user","motDePasse");
    		      LoginContext loginContext = new LoginContext("Login",loginCallback);
    		      loginContext.login();
    		      System.out.println("Le principal="+loginContext.getSubject().getPrincipals().iterator().next().getName());
    		      result=true;
    		      System.out.println("Authentification=="+result);
    		      try
    				{
    				AccessController.checkPermission(new PermissionImpl("admin"));
    				System.out.println("Authorisation success!!!!!!!!");
    				}catch (AccessControlException e) {
    					e.printStackTrace();
    					System.out.println("Authorisation failed!!!!!!!!");
    				}
    		      loginCallback=null;
    		    }
    		   catch (Exception e) {
    			   e.printStackTrace();
    		     System.out.println("login failed");
    		     result = false;
    		   }
     
    	}
    le fichier policy est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    grant Principal jaas.fileLogin.MyPrincipalRole "user"{
      permission jaas.fileLogin.PermissionImpl "admin";
    };
    j'ai ajouter l'argument:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -Djava.security.policy=C:\NesNes.policy
    l'authentification va bien mais j'obtient toujours l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    java.security.AccessControlException: access denied (jaas.fileLogin.PermissionImpl admin)
    Authorisation failed!!!!!!!!
    	at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
    	at java.security.AccessController.checkPermission(AccessController.java:427)
    	at Test.main(Test.java:33)
    ou est le probleme?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Tu as oublié une partie importante : après l'authentication (que tu as faite) tu dois faire l'autorisation, ce qui est fait par les méthode du genre "doAsPrivileged", regarde le turoriel JAAS pour un exemple : http://java.sun.com/javase/6/docs/te...AcnAndAzn.html

    A plus

  3. #3
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut
    Citation Envoyé par George7 Voir le message
    Salut,

    Tu as oublié une partie importante : après l'authentication (que tu as faite) tu dois faire l'autorisation, ce qui est fait par les méthode du genre "doAsPrivileged", regarde le turoriel JAAS pour un exemple : http://java.sun.com/javase/6/docs/te...AcnAndAzn.html

    A plus
    salut George,
    à propos l'authorisation, je ne l'ai pas oublié
    en effet,ce que je connait est l'authorisation consiste à affecter les principal au subject puis controler l'acces au ressources(ce control peut être fait à l'aide de doAsPrivilegedou à l'aide de AccessController.checkPermission(permission); comme j'ai fait)
    j'ai affecter les principal dans la methode commit de mon LoginModule:
    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
    public boolean commit() throws LoginException {
     
    		if (!succeeded) {
    			userName = null;
    			return false;
    		}
    		namePrincipal = new MyPrincipalRole(userName);
    		if (!subject.getPrincipals().contains(namePrincipal)) {
    			{
    				subject.getPrincipals().add(namePrincipal);
    				System.out.println("commit done");
    			}
    		}
    		for(int i=0;i<subject.getPrincipals().size();i++)
    			System.out.println("Principal num "+i+" ="+subject.getPrincipals().iterator().next().getName());
    		userName = null;
    		commitSucceeded = true;
    		return true;
    	}
    une autre chose :j'ai constaté que lorsque je modifier mon fichier policy(je fait grant sans indiquer le Principal en question):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    grant {
      permission jaas.fileLogin.PermissionImpl "admin";
    };
    les choses vont bien
    c'est comme si le grant n'affecte pas le principal désiré malgré que j'ai bien vérifié le principal de l'utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(int i=0;i<subject.getPrincipals().size();i++)
    			System.out.println("Principal num "+i+" ="+subject.getPrincipals().iterator().next().getName());
    pouvez vous m'aider à déterminer l'erreur

  4. #4
    Invité
    Invité(e)
    Par défaut
    Ok au temps pour moi j'avais pas vu ton module
    Juste par curiosité, je peux voir ta classe Principal ?

  5. #5
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut
    Citation Envoyé par George7 Voir le message
    Ok au temps pour moi j'avais pas vu ton module
    Juste par curiosité, je peux voir ta classe Principal ?
    voici ma classe principal:
    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
     
    package jaas.fileLogin;
     
    import java.io.*;
    import java.security.Principal;
     
     
    /**
     *
     * @author  Riadh
     * @version 1.0
     */
    public class MyPrincipalRole implements Principal, Serializable
    {
     
     
    	private static final long serialVersionUID = 1L;
    	protected String name;
     
    	/**
             * Création d'un MyPrincipalRole avec un nom.
             *
             * <p>
             *
             * @param nom du principal.
             * @exception NullPointerException si <code>name</code>
             *                      est <code>null</code>.
             */
    	public MyPrincipalRole(String name)
    	{
    		if (name == null) {
    			throw new NullPointerException("Illegal null name");
    		}
    		this.name = name;
     
    	}
     
     
     
    	public boolean equals(Object another)
    	{
    		if (!(another instanceof MyPrincipalRole)) {
    			return false;
    		}
    		return ((MyPrincipalRole) another).getName().equals(name);
    	}
     
     
    	public void setName(String name)
    	{
    		this.name = name;
    	}
     
    	/**
             * Retourne le nom du <code>MyPrincipalRole</code>.
             *
             * <p>
             *
             * @return le nom du <code>MyPrincipalRole</code>
             */
    	public String getName()
    	{
    		return name;
    	}
    }

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bon là je vois pas trop de problème. Le fait que ça marche quand tu ne précises pas de Principal est normal, car ça signifie que tout le monde reçoit ces permissions, donc même sans authentification ça devrait marcher. As tu essayé avec la méthode doAsPrivileged ?

  7. #7
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut
    Citation Envoyé par George7 Voir le message
    Bon là je vois pas trop de problème. Le fait que ça marche quand tu ne précises pas de Principal est normal, car ça signifie que tout le monde reçoit ces permissions, donc même sans authentification ça devrait marcher. As tu essayé avec la méthode doAsPrivileged ?
    je ne sait pas beaucoup comment utiliser cette méthode ni son intéret:
    comment je puisse indiquer les permissions nécéssaires pour invoker une action car cette methode ne prenne pas comme arguments les permissions nécéssaires pour l'éxécution de l'action
    ce que je pense est qu'il faut passer toulours par AccessController.checkPermission(permission ) pour protéger une application
    est ce que mon raisonnement est faut ?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Et bien le doAsPrivileged lance une action avec le Subject que tu donnes, cette action peut ensuite tester si le sujet a les permissions nécessaires avec ta méthode. Mais si tu ne lances pas en privilégié, je suis pas sûr que ça puisse marcher car aucun lien n'est fait avec le sujet qui doit avoir les permissions. Essaye de faire ton check dans une action privilégiée

  9. #9
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut
    Citation Envoyé par George7 Voir le message
    cette action peut ensuite tester si le sujet a les permissions nécessaires avec ta méthode.
    ou sont invoqués les permissions nécessaires pour ma méthode
    supposons que ma methode ne contient qu'un System.out.println("Authorisation success!!!!!!!!");
    j'aurait ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     javax.security.auth.Subject.doAsPrivileged(
            subject,
            new PrivlegedAction<Void>() { public Void run() {
                System.out.println("Authorisation success!!!!!!!!");
            }}
        );
    mais qu'elles sont les permissions nécessaires pour invoker cette action
    (qui est l'équivalent de AccessController.checkPermission(permission) dans la methode doAsPrivileged?)

  10. #10
    Invité
    Invité(e)
    Par défaut
    Ton action là n'a rien de spécial... il faut que tu testes les permission toi même dans ton cas (checkPermission comme tu as fait)
    Dans l'exemple de sun, c'est les accès au fichier qui doivent tester les permission, c'est pour ça qu'ils ne le font pas eux même, mais dans ton cas tu dois tester explicitement

  11. #11
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut
    Citation Envoyé par George7 Voir le message
    Ton action là n'a rien de spécial... il faut que tu testes les permission toi même dans ton cas (checkPermission comme tu as fait)
    Dans l'exemple de sun, c'est les accès au fichier qui doivent tester les permission, c'est pour ça qu'ils ne le font pas eux même, mais dans ton cas tu dois tester explicitement
    est ce que vous voulez dire que je doit appeler AccessController.checkPermission(permission) au sein de la methode doPrivileged
    si ce le cas, quel serait alors l'interet de la methode doPrivileged ?

  12. #12
    Invité
    Invité(e)
    Par défaut
    ça sert à exécuter une portion de code en tant que le sujet que tu donnes en paramètre (cf la javadoc).
    Il me semble que cela marche ainsi :
    • doAS -> j'exécute le code en tant que tel sujet
    • checkPermission -> est-ce que le sujet courant a cette permission

  13. #13
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut
    Citation Envoyé par George7 Voir le message
    ça sert à exécuter une portion de code en tant que le sujet que tu donnes en paramètre (cf la javadoc).
    Il me semble que cela marche ainsi :
    • doAS -> j'exécute le code en tant que tel sujet
    • checkPermission -> est-ce que le sujet courant a cette permission
    merci infiniment George
    j'ai testé avec et ça a marché:
    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
     
    javax.security.auth.Subject.doAsPrivileged(
        	LoginManager.getSubject(),
            new PrivilegedAction<Void>() 
        		    { public Void run() {
        		        	  PermissionImpl p=new PermissionImpl("admin");
        			    	  AccessController.checkPermission(p);
                                      System.out.println("Authorisation success!!!!!!!!");
    			          return null;
        		        }}, null
        		    );
     
    		}catch (AccessControlException e) {
    			e.printStackTrace();
    			System.out.println("Authorisation failed!!!!!!!!");
    		}
    une autre question svp:j'ai testé cet exemple dans une application java en indiaquant l'adresse de mon fichier policy dans le fichier java.security se trouvant dans jre/lib/security
    mais en intégrant mon module jaas dans une application web, ça n'a marché que lorsque j'ai ajouter l'argument -Djava.security.auth.policy=C:\NesNes.policy
    j'ai même essayé de declarer le grant directement dans le fichier catalina.policymais sans resultat
    est ce que tu connait une solution pour spécifier l'url de mon fichier policy autre qu'ajouter l'argument -Djava.security.auth.policy=C:\NesNes.policy (avec eclipse bouton droit sur le fichier-->Run Configurations-->Arguments-->VM Arguments)

  14. #14
    Invité
    Invité(e)
    Par défaut
    Avec JAAS en tant que tel, il n'y a à ma connaissance pas d'autres moyenssi tu veux ajouter dans le fichier catalina.policy, il faut démarrer ton eclipse avec l'option -security, tu trouveras plus d'infos ici : http://tomcat.apache.org/tomcat-6.0-...ger-howto.html

  15. #15
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut
    Citation Envoyé par George7 Voir le message
    Avec JAAS en tant que tel, il n'y a à ma connaissance pas d'autres moyenssi tu veux ajouter dans le fichier catalina.policy, il faut démarrer ton eclipse avec l'option -security, tu trouveras plus d'infos ici : http://tomcat.apache.org/tomcat-6.0-...ger-howto.html
    merci infiniment George pour tout vos réponses
    vous étiez génial

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. 8.10->9.04 probleme avec Xorg et les connexion reseau
    Par Reskibil dans le forum Ubuntu
    Réponses: 1
    Dernier message: 01/06/2009, 10h22
  2. probleme avec le locate (les dates)
    Par tchimou dans le forum Bases de données
    Réponses: 7
    Dernier message: 02/05/2007, 10h35
  3. Réponses: 5
    Dernier message: 10/03/2007, 21h45
  4. [onKeydown] Probleme avec pour detecter les majuscules des minuscules
    Par magnus2005 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 29/09/2006, 22h48
  5. Probleme avec DateDiff pour les années....
    Par angelevil dans le forum VB 6 et antérieur
    Réponses: 23
    Dernier message: 27/03/2006, 09h19

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