2013-06-24 4 views
0

J'essaie de tirer des rôles d'une base de données à utiliser pour l'authentification des utilisateurs. Pour ce faire, je l'ai créé un objet groupe qui étend le rôle tout comme le code ci-dessous:Quelle est la différence entre le rôle et le nom dans la classe de rôle symfony2?

// src/Acme/Bundle/UserBundle/Entity/Group.php 
namespace Acme\UserBundle\Entity; 

use Symfony\Component\Security\Core\Role\Role; 
use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Table(name="acme_groups") 
* @ORM\Entity() 
*/ 
class Group extends Role 
{ 
    /** 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id() 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(name="name", type="string", length=30) 
    */ 
    private $name; 

    /** 
    * @ORM\Column(name="role", type="string", length=20, unique=true) 
    */ 
    private $role; 

    /** 
    * @ORM\ManyToMany(targetEntity="User", mappedBy="groups") 
    */ 
    private $users; 

    public function __construct() 
    { 
     $this->users = new ArrayCollection(); 
    } 

    // ... getters and setters for each property 

    /** 
    * @see RoleInterface 
    */ 
    public function getRole() 
    { 
     return $this->role; 
    } 
} 

Ce qui me embrouille est que je ne vois pas la relation entre cette classe et les champs correspondants dans security.yml tels as:

role_hierarchy: 
    ROLE_ADMIN:  ROLE_USER 
    ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

Ainsi, les noms se trouveraient-ils sur le côté droit du: et le rôle sur le côté droit? Par exemple dans

ROLE_ADMIN: ROLE_USER 

ROLE_ADMIN serait le nom du groupe et ROLE_USER deviendrait le rôle? Ce qui n'a pas non plus de sens pour moi, c'est comment symfony2 implémente la propriété de rôle en tant que variable unique et non en tant que tableau. Puisque dans l'instruction

 ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

Il existe plusieurs rôles, pas seulement un rôle. Comment cela correspond-il à la classe définie ci-dessus? Je suis le livre de cuisine de symfony2 http://symfony.com/doc/current/cookbook/security/entity_provider.html#managing-roles-in-the-database.

Répondre

1

Le fichier security.yml role_hierarchy fait référence à l'héritage du rôle. Il vous permet de créer plusieurs rôles et d'indiquer ensuite que certains rôles héritent d'autres rôles. http://symfony.com/doc/current/book/security.html#hierarchical-roles

ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

Les moyens ci-dessus que si en tant qu'utilisateur, j'ai le rôle « ROLE_SUPER_ADMIN » (qui vient du champ de rôle dans votre entité du groupe) alors je hérite aussi des rôles « ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH ».

donc: ROLE_TO_INHERIT: [ROLES_TO_INHERIT_FROM]

Ainsi, votre champ de nom n'a aucune signification dans security.yml que votre champ de rôle. La hiérarchie des rôles est distincte de l'endroit où vous stockez vos rôles. C'est un niveau de configuration supplémentaire de sorte que, par exemple, vous n'avez pas besoin d'ajouter 3 rôles à tous les super-administrateurs, mais ajoutez simplement le rôle de super-administrateur et ils hériteront de tous les autres rôles.

Espérons que cela a du sens, n'oubliez pas que pour utiliser la hiérarchie des rôles, vous devez avoir les rôles dans votre base de données. Il n'est pas bon de configurer la hiérarchie ROLE_SUPER_ADMIN ci-dessus si vous n'avez pas de ROLE_SUPER_ADMIN que vous pouvez affecter aux utilisateurs. Créez donc tous vos rôles dans votre table de groupe, puis configurez la hiérarchie.

+0

Tout cela a du sens maintenant, merci beaucoup! –

Questions connexes