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

Symfony PHP Discussion :

Notions de bases ACL


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 28
    Points : 24
    Points
    24
    Par défaut Notions de bases ACL
    Bonjour,

    Je me suis dernièrement intéressé aux Access Control List dans symfony2. Symfony2 est le premier framework que j'utilise et je crois que je commence à me débrouiller, mais pour les ACL j'ai quelques questions à poser...

    J'ai lu la doc: http://symfony.com/doc/2.0/cookbook/security/acl.html ou ils explique comment créer des acl avec :

    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
     
    public function addCommentAction(Post $post)
    {
        $comment = new Comment();
     
        // setup $form, and bind data
        // ...
     
        if ($form->isValid()) {
            $entityManager = $this->get('doctrine.orm.default_entity_manager');
            $entityManager->persist($comment);
            $entityManager->flush();
     
            // creating the ACL
            $aclProvider = $this->get('security.acl.provider');
            $objectIdentity = ObjectIdentity::fromDomainObject($comment);
            $acl = $aclProvider->createAcl($objectIdentity);
     
            // retrieving the security identity of the currently logged-in user
            $securityContext = $this->get('security.context');
            $user = $securityContext->getToken()->getUser();
            $securityIdentity = UserSecurityIdentity::fromAccount($user);
     
            // grant owner access
            $acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_OWNER);
            $aclProvider->updateAcl($acl);
        }
    }
    et comment controller des accès avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // BlogController.php
    public function editCommentAction(Comment $comment)
    {
        $securityContext = $this->get('security.context');
     
        // check for edit access
        if (false === $securityContext->isGranted('EDIT', $comment))
        {
            throw new AccessDeniedException();
        }
     
        // retrieve actual comment object, and do your editing here
        // ...
    }
    Ce que j'ai de la peine à comprendre c'est quand est-ce qu'on doit utiliser les ACL plutot que des contrôles sur les user id dans le controller.
    La doc donne l'exemple d'un système de commentaire ou avec les ACL on donne l'autorisation de modifier un commentaire uniquement à l'auteur du commentaire ( et à l'admin j'imagine ). D'après ce que j'ai compris à chaque fois qu'un commentaire va être créé, sf2 va créer une entrée dans la base de donnée qui garde en mémoire l'id du commentaire et de l'auteur.


    Mais si par exemple on désire afficher un bouton éditer ou un formulaire uniquement sur les posts dont on est l'auteur vous vous y prendriez comment? Est-ce qu'il y a la possibilité de faire appel au ACL dans les templates twig?

    J'aimerai aussi savoir s'il existe et si vous avez testé certains bundle qui permettent de gérer les acl, peut-être sous la forme d'un CRUD.

    Merci et bonne journée

  2. #2
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Salut,

    Tres interessant les ACL.

    Depuis twig tu peux simplement faire {% if is_granted('EDIT', comment) %}

    C'est plus souple que de simplement checker l'id du user. Parce qu'en realite tu dois deja faire if(user_id == comment_id OR user is admin), bref c'est pas tres beau et peu flexible (et si tu ajoutes un role moderateur ?).

    Avec les ACL tu gardes juste is_granted(edit, $comment), et ensuite c'est cote ACL que tu donnes les bons droits aux bonnes personnes.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    Depuis twig tu peux simplement faire {% if is_granted('EDIT', comment) %}
    Merci c'est pile ce que je recherchais! Ou est-ce que tu trouves toutes les fonctions auquelles tu as accès dans les templates twig? C'est vraiment utile et j'ai beau avoir regardé sur la doc symfony ou twig je suis pas tombé dessus. Il y a une règle qui dit a quel services on à accès dans twig?

  4. #4
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Ya pas de regles c'est la jungle ici !

    Tu peux utiliser app.session pour acceder a la session, et d'autres app.unService j'imagine mais j'ai pas teste.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    Ok je vais tester ça dans un petit moment... Mais c'est bizarre, je comprend pas pourquoi on doit pas d'abord "instancier" ( c'est le bon verbe?) le security context, comme on le fait dans le controller avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $securityContext = $this->get('security.context');
    $securityContext->isGranted('EDIT', $comment)
    twig le fait tout seul?

  6. #6
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Oui c'est juste un raccourci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function is_granted() {
      return $this->container->get('security.context')->isGranted();
    }

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    J'ai lu un peu la doc des extensions dans twig... Apparemment les fonctions implémentées par sf2 et disponibles dans twig sont toutes stockées dans des fichiers nomdelextensionExtension.php Par exemple celle dont en parlais se trouve dans SecurityExtension.php :
    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
    <?php
     
    /*
     * This file is part of the Symfony package.
     *
     * (c) Fabien Potencier <fabien@symfony.com>
     *
     * For the full copyright and license information, please view the LICENSE
     * file that was distributed with this source code.
     */
     
    namespace Symfony\Bundle\SecurityBundle\Twig\Extension;
     
    use Symfony\Component\Security\Acl\Voter\FieldVote;
    use Symfony\Component\Security\Core\SecurityContextInterface;
     
    /**
     * SecurityExtension exposes security context features.
     *
     * @author Fabien Potencier <fabien@symfony.com>
     */
    class SecurityExtension extends \Twig_Extension
    {
        private $context;
     
        public function __construct(SecurityContextInterface $context = null)
        {
            $this->context = $context;
        }
     
        public function isGranted($role, $object = null, $field = null)
        {
            if (null === $this->context) {
                return false;
            }
     
            if (null !== $field) {
                $object = new FieldVote($object, $field);
            }
     
            return $this->context->isGranted($role, $object);
        }
     
        /**
         * {@inheritdoc}
         */
        public function getFunctions()
        {
            return array(
                'is_granted' => new \Twig_Function_Method($this, 'isGranted'),
            );
        }
     
        /**
         * Returns the name of the extension.
         *
         * @return string The extension name
         */
        public function getName()
        {
            return 'security';
        }
    }
    Par contre je ne comprend pas la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     /**
         * {@inheritdoc}
         */
        public function getFunctions()
        {
            return array(
                'is_granted' => new \Twig_Function_Method($this, 'isGranted'),
            );
        }
    normalement pour enregistrer une fonction dans une extension twig il faut utiliser , si on suit la doc de twig:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Project_Twig_Extension extends Twig_Extension
    {
        public function getGlobals()
        {
            return array(
                'text' => new Text(),
                'lipsum' => new Twig_Function(new Text(), 'getLipsum'),
            );
        }
     
        // ...
    }
    Ce qui est bizarre c'est que symfony semble faire ça différemment avec la fontion getFunctions() Je n'ai pas trouvé la classe \Twig_Extension ( NetBeans en serait capable?) donc je l'ai pas vraiment compris tout le processus... D'ailleurs vous utiliser quels gestionnaires de projets?

    C'est dommage qu'il n'y ait pas une page qui liste toutes les fonctions disponible dans twig quand on utlise la standard edition de sf2. Ca m'aurait aidé et ça pourrait aider d'autre personnes je suppose.

Discussions similaires

  1. Notions de base
    Par akito dans le forum MVC
    Réponses: 3
    Dernier message: 07/08/2009, 18h11
  2. [Généralités] Notions de base : les threads
    Par Raptor92 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/07/2009, 15h24
  3. Réponses: 1
    Dernier message: 18/12/2007, 18h43
  4. Notions de base Active directory
    Par Zelltemplar dans le forum Windows Serveur
    Réponses: 5
    Dernier message: 26/03/2007, 15h07
  5. [POO Basique] Besoin de précision sur une notion de base
    Par alois.cochard dans le forum Langage
    Réponses: 8
    Dernier message: 15/09/2006, 09h01

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