Partage
  • Partager sur Facebook
  • Partager sur Twitter

[symfony 3] role, date et domaine

    9 janvier 2018 à 11:45:39

    Bonjour

    je voudrais savoir si on peut gérer des dates de validité pour les rôles, ainsi que des domaines par rôle?

    voila ma table user (un extrait)

    /**
     * AaUtilisateur
     *
     * @ORM\Table(name="aa_utilisateur", indexes={@ORM\Index(name="FK_aa_utilisateur_lgu_id", columns={"lang_id"}), @ORM\Index(name="FK_aa_utilisateur_lie_type_id", columns={"lien_id"})})
     
    class AaUtilisateur implements UserInterface
    {
        // TODO
        /**
         * @var string
         *
         * @ORM\Column(name="usr_nom", type="string", length=30, nullable=false)
         * 
         */
        private $usrNom;
    
        /**
         * @var string
         *
         * @ORM\Column(name="usr_prenom", type="string", length=30, nullable=false)
         */
        private $usrPrenom;
    
        /*  */
    
    
        /**
         * @ORM\OneToMany(targetEntity="*********\Entity\APourRoleAff", mappedBy="usr")
         */
        private $authorizations;
    
        
    
     
    
        /**
         * Constructor
         */
        public function __construct()
        {
            $this->roles = new ArrayCollection();
            $this->authorizations = new ArrayCollection();
            
        }
    
        /**
         * @return string
         */
        public function getUsername()
        {
            return $this->username;
        }
    
        /**
         * @param string $username
         */
        public function setUsername($username)
        {
            $this->username = $username;
        }
    
     
        /**
         * @return mixed
         */
        public function getAuthorizations()
        {
            return $this->authorizations;
        }
    
        /**
         * @param mixed $authorizations
         */
        public function setAuthorizations($authorizations)
        {
            $this->authorizations = $authorizations;
        }
    
        /**
         * @return mixed
         */
        public function getRoles()
        {
            $result = [];
    
            foreach ($this->authorizations as $authorization) {
                $result[] = $authorization->getRole()->getRoleStatus();
            }
    
            return $result;
        }
    
    
      
        public function eraseCredentials()
    
        {
    
        }
    
        /** @see \Serializable::serialize() */
        public function serialize()
        {
            return serialize(array(
                $this->usrId,
                $this->username,
                $this->password,
                // see section on salt below
                // $this->salt,
            ));
        }
    
        /** @see \Serializable::unserialize() */
        public function unserialize($serialized)
        {
            list (
                $this->usrId,
                $this->username,
                $this->password,
                // see section on salt below
                // $this->salt
                ) = unserialize($serialized);
        }
    
    
     
    
        /**
         * Add authorization
         *
         * @param \************\Entity\APourRoleAff $authorization
         *
         * @return AaUtilisateur
         */
        public function addAuthorization(APourRoleAff $authorization)
        {
            $this->authorizations[] = $authorization;
    
            return $this;
        }
    
        /**
         * Remove authorization
         *
         * @param \***********\Entity\APourRoleAff $authorization
         */
        public function removeAuthorization(APourRoleAff $authorization)
        {
            $this->authorizations->removeElement($authorization);
        }
    
     
    }
    


    on peut voir que les rôles et autorisation viennent de la table "a_pour_role" que voici

    /**
     * APourRoleAff
     *
     * @ORM\Table(name="a_pour_role_aff", indexes={@ORM\Index(name="FK_a_pour_role_aff_role_id", columns={"role_id"}), @ORM\Index(name="FK_a_pour_role_aff_usr_id", columns={"usr_id"}), @ORM\Index(name="IDX_9DFB639B3A20CD92", columns={"teq_id"})})
     * 
     */
    class APourRoleAff
    {
        
    
        /**
         * @var \DateTime
         *
         * @ORM\Column(name="rol_dat_deb", type="date", nullable=false)
         */
        private $rolDateDeb;
    
        /**
         * @var \DateTime
         *
         * @ORM\Column(name="rol_dat_fin", type="date", nullable=false)
         */
        private $rolDateFin;
    
        /**
         * @var \Atdqmarch\ArchivageBundle\Entity\AaRRole
         *
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="NONE")
         * @ORM\ManyToOne(targetEntity="****\Entity\AaRRole")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="role_id", referencedColumnName="role_id")
         * })
         */
        private $rol;
    
        /**
         * @var \******\Entity\AaTheque
         *
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="NONE")
         * @ORM\ManyToOne(targetEntity="*******\AaTheque")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="teq_id", referencedColumnName="teq_id")
         * })
         */
        private $teq;
    
        /**
         * @var \******\Entity\AaUtilisateur
         *
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="NONE")
         * @ORM\ManyToOne(targetEntity="******\Entity\AaUtilisateur", inversedBy="authorizations")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="usr_id", referencedColumnName="usr_id")
         * })
         */
        private $usr;
    
    
        /**
         * @return mixed
         */
        public function getTeq()
        {
            return $this->teq;
        }
    
        /**
         * @return mixed
         */
        public function getRole()
        {
            return $this->rol;
        }
    
        /**
         * @return mixed
         */
        public function getRolDateDeb()
        {
            return $this->rolDateDeb;
        }
    
        /**
         * @return mixed
         */
        public function getRolDateFin()
        {
            return $this->rolDateFin;
        }
    
        /**
         * Set rolAffDatSuppr
         *
         * @param \DateTime $rolAffDatSuppr
         *
         * @return APourRoleAff
         */
        public function setRolAffDatSuppr($rolAffDatSuppr)
        {
            $this->rolAffDatSuppr = $rolAffDatSuppr;
    
            return $this;
        }
    
        /**
         * Get rolAffDatSuppr
         *
         * @return \DateTime
         */
        public function getRolAffDatSuppr()
        {
            return $this->rolAffDatSuppr;
        }
    
        /**
         * Set rolDateDeb
         *
         * @param \DateTime $rolDateDeb
         *
         * @return APourRoleAff
         */
        public function setRolDateDeb($rolDateDeb)
        {
            $this->rolDateDeb = $rolDateDeb;
    
            return $this;
        }
    
        /**
         * Set rolDateFin
         *
         * @param \DateTime $rolDateFin
         *
         * @return APourRoleAff
         */
        public function setRolDateFin($rolDateFin)
        {
            $this->rolDateFin = $rolDateFin;
    
            return $this;
        }
    
        /**
         * Set rol
         *
         * @param \************\Entity\AaRRole $rol
         *
         * @return APourRoleAff
         */
        public function setRol(\********\Entity\AaRRole $rol)
        {
            $this->rol = $rol;
    
            return $this;
        }
    
        /**
         * Get rol
         *
         * @return \***********\Entity\AaRRole
         */
        public function getRol()
        {
            return $this->rol;
        }
    
        /**
         * Set teq
         *
         * @param \***********\Entity\AaTheque $teq
         *
         * @return APourRoleAff
         */
        public function setTeq(\**********\Entity\AaTheque $teq)
        {
            $this->teq = $teq;
    
            return $this;
        }
    
        /**
         * Set usr
         *
         * @param \**********\Entity\AaUtilisateur $usr
         *
         * @return APourRoleAff
         */
        public function setUsr(\*********\Entity\AaUtilisateur $usr)
        {
            $this->usr = $usr;
    
            return $this;
        }
    
        /**
         * Get usr
         *
         * @return \************\Entity\AaUtilisateur
         */
        public function getUsr()
        {
            return $this->usr;
        }
    }


    il y a donc un lien sur une table rôle et une table thèque (des domaines pour le client)

    voila la table role

    /**
     * AaRRole
     *
     * @ORM\Table(name="aa_r_role", indexes={@ORM\Index(name="FK_aa_r_role_typ_ref_id", columns={"role_id"})})
     * 
     */
    class AaRRole extends AaReference
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="role_id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $roleId;
    
        /**
         * @var string
         *
         * @ORM\Column(name="role_status", type="string", length=25, nullable=false)
         */
        private $roleStatus;
    
        /**
         * @return string
         */
        public function getRoleStatus()
        {
            return $this->roleStatus;
        }
    
        /**
         * Get roleId
         *
         * @return integer
         */
        public function getRoleId()
        {
            return $this->roleId;
        }
    
        /**
         * Set roleStatus
         *
         * @param string $roleStatus
         *
         * @return AaRRole
         */
        public function setRoleStatus($roleStatus)
        {
            $this->roleStatus = $roleStatus;
    
            return $this;
        }
    }

    et voila la table thèque (extrait)

    /**
     * AaTheque
     *
     * @ORM\Table(name="aa_theque", indexes={@ORM\Index(name="FK_aa_theque_ttq_id", columns={"tteq_id"})})
     * 
     */
    class AaTheque
    {
        /**
         * @var string
         *
         * @ORM\Column(name="teq_nom", type="string", length=50, nullable=false)
         */
        private $teqNom;
    
     
    
        /**
         * @var integer
         *
         * @ORM\Column(name="teq_id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $teqId;
    
     
    
    
        /**
         * @return mixed
         */
        public function getTeqNom()
        {
            return $this->teqNom;
        }
    
        /**
         * Set teqNom
         *
         * @param string $teqNom
         *
         * @return AaTheque
         */
        public function setTeqNom($teqNom)
        {
            $this->teqNom = $teqNom;
    
            return $this;
        }
    
     
    
        /**
         * Get teqId
         *
         * @return integer
         */
        public function getTeqId()
        {
            return $this->teqId;
        }
    
     
    }
    

    Comment, pour un utilisateur, remonter ses rôles (le rolestatut en fait) et  en fonction de la date du jour, cette dernière devant être entre la date début et la date fin contenu dans la table "a pour rôle" pour un rôle donné.

    à ce jour si l'utilisateur n'a pas de ligne dans la table "a pour role" la gestion de Symfony est ok

    mais si il a une ligne (ou plusieurs)  mais avec des dates n'incluant pas la date du jour le(s) role status est(sont) quand même remonté.

    Ensuite, si les dates sont bonnes, comment remonter le(s) rolestatut pour une(des) thèques différentes?

    il faudrait pouvoir voir les thèques associées aux rôles dans les propriétés du user

    et ensuite comment récupérer la données dans un twig ou dans un controller comme on le fait avec is_granted?

    merci de vos lumières

    Cordialement

    PS:

    je précise que nous étions deux à développer sur ce projet et que je me retrouve seul. Et je reprend cette partie que mon collègue avait commencé à faire.

    Et que l'entité AaReference permet de traduire des libellés via le mécanisme de transtable
    /**
     * Class AaReference
     * @package ******\Entity
     *
     * @ORM\MappedSuperclass
     */
    class AaReference implements Translatable
    {
        /**
         * @var string
         *
         * @Gedmo\Translatable
         * @ORM\Column(name="lib", type="string", length=50, nullable=false)
         */
        protected $lib;
    
        /**
         * @var \******\Entity\AaRTypeReference
         *
         * @ORM\ManyToOne(targetEntity="********\Entity\AaRTypeReference")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="typ_ref_id", referencedColumnName="typ_ref_id")
         * })
         */
        protected $typRef;
    
        /**
         * @Gedmo\Locale
         * Used locale to override Translation listener`s locale
         * this is not a mapped field of entity metadata, just a simple property
         * and it is not necessary because globally locale can be set in listener
         */
        protected $locale;
    
        /**
         * @param $locale
         */
        public function setTranslatableLocale($locale)
        {
            $this->locale = $locale;
        }
    
        /**
         * Set lib
         *
         * @param string $lib
         *
         * @return AaReference
         */
        public function setLib($lib)
        {
            $this->lib = $lib;
    
            return $this;
        }
    
        /**
         * Get lib
         *
         * @return string
         */
        public function getLib()
        {
            return $this->lib;
        }
    
        /**
         * Set typRef
         *
         * @param \******\Entity\AaRTypeReference $typRef
         *
         * @return AaReference
         */
        public function setTypRef(\******\Entity\AaRTypeReference $typRef = null)
        {
            $this->typRef = $typRef;
    
            return $this;
        }
    
        /**
         * Get typRef
         *
         * @return \******\Entity\AaRTypeReference
         */
        public function getTypRef()
        {
            return $this->typRef;
        }
    }

    -
    Edité par Pecos38 10 janvier 2018 à 8:41:20

    • Partager sur Facebook
    • Partager sur Twitter

    Le souvenir des bienfaits reçus est fragile, comparé à l'ingratitude (Léonard de Vinci)

      11 janvier 2018 à 9:07:11

      Bonjour

      Bon j'ai peut être trouvé une solution.

      On pourrait modifier la fonction GetRole de l'entité AaUtilisateur

      public function getRoles()
      {
          $result = [];
          $madatejour = new \DateTime('now');    
      
           foreach ($this->authorizations as $authorization) {
      	
                if(($madatejour > $authorization->getRolDateDeb()) and ($madatejour < $authorization->getRolDateFin()))         
                   {
                   $result[] = $authorization->getRole()->getRoleStatus()."_".$authorization->getTeq()->getTeqNom();
      	     }
          }
      
          return $result;
      }

      on aurait donc un(des) role(s) issu(s) de la concaténation de role_status et thèque, à la date du jour

      mais je vois des bémols

      Le nom de la thèque ne devra comporter que des lettres et des chiffres et tout en majuscule. Mais ça c'est gérable lors de la création et/ou modification de l'entité AaTheque.

      Dans l'utilisation de ce rôle  dans les is_granted("ROLE_STATUS_THEQUE"), pourra-t-on tester que la 1ere partie de la concaténation et/ou la seconde partie?

      Cordialement

      • Partager sur Facebook
      • Partager sur Twitter

      Le souvenir des bienfaits reçus est fragile, comparé à l'ingratitude (Léonard de Vinci)

        13 janvier 2018 à 15:14:47

        Hello,

        Tu as bien vu pour le retour de getRoles(). Symfony ne fait qu'appeler cette méthode, tu peux y mettre ce que tu veux dedans, y compris le test sur la date comme tu l'as fait.

        Par contre je n'ai pas bien saisi les "thèques" ? Tu veux qu'un utilisateur puisse avoir accès à certaines thèques seulement ? Dans ce cas, et comment est faite ton application, tu peux utiliser l'annotation Secure. Sur une action de contrôleur :

        <?php
        
        class Controller
        {
            /**
             * @Secure("has_role('ROLE_XXX') || user.hasTheque(theque)")
             */
            public function xxxAction(Theque $theque)
            {
            }
        }

        Dans l'annotation tu as accès à la variable "user" qui est l'utilisateur courant, ainsi que chaque argument de la méthode.

        L'annotation que je t'ai mise te donne donc accès à la page si : soit tu as le rôle ROLE_XXX, soit ton user courant est lié à la thèque en argument. Tu peux utiliser un ET (&&) et n'importe quelle autre syntaxe de l'expression language. Plus d'info : https://symfony.com/doc/current/best_practices/security.html#the-security-annotation et https://symfony.com/doc/current/components/expression_language.html

        • Partager sur Facebook
        • Partager sur Twitter
          20 janvier 2018 à 23:12:32

          Bonjour

          Il faut donc aussi que je rajoute une fonction getTheque et une fonction hasTheque dans mon entite AaUtilisateur.

          La getTheque serait comme la getRole sauf que l'on ramene un tableau contenant les  teqId

          public function getTheque()
          {
              $result = [];
              $madatejour = new \DateTime('now');   
           
               foreach ($this->authorizations as $authorization) {
               
                    if(($madatejour > $authorization->getRolDateDeb()) and ($madatejour < $authorization->getRolDateFin()))        
                       {
                       $result[] = $authorization->getTeq()->getTeqId();
                   }
              }
           
              return $result;
          }

          Avez vous un exemple de fonction hasXXX?

          Les Theques je dirais que ce sont des domaines du sites.

          De ce côté ce n'est pas encore très clair du côté du client.

           Je pense que les roles seront liés aux theques et donc un utilisateur pourra avoir ceci

          • Role_XXX1 sur une theque A
          • Role_XXX2 sur une theque B
          • Role_XXX3 sur la theque A
          • Etc

          Et la il faudrait que chaque role, ramené par ma fonction getRole, contienne un tableau des theque associées.

          Est ce possible?

          Cordialement

          -
          Edité par Pecos38 20 janvier 2018 à 23:39:37

          • Partager sur Facebook
          • Partager sur Twitter

          Le souvenir des bienfaits reçus est fragile, comparé à l'ingratitude (Léonard de Vinci)

          [symfony 3] role, date et domaine

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown