La gestion des utilisateurs/rôles/groupes de FOSUserBundle

Je suis l'élaboration d'une simple CRUD pour gérer les utilisateurs/rôles/groupes de l'application dans laquelle je travaille. Pour gérer les utilisateurs, je suis en utilisant FOSUserBundle. Ce que je veux faire peut être accompli de plusieurs façons:

  • L'attribution de rôles aux groupes et assigner des utilisateurs à ces groupes
  • L'attribution de rôles aux utilisateurs directement

Mais je n'ai aucune idée de comment. Je savais que FOSUser BaseUser classe dispose déjà d'une colonne roles et dans le la documentation de FOSUser explique comment établir une ManyToMany relation entre les utilisateurs et les groupes, mais ne parlez pas grand chose sur les rôles. La seule idée qui vient à l'esprit est de créer une entité pour gérer les rôles ainsi qu'un formulaire pour le même but, quelque chose comme ce que vous voyez ci-dessous:

Rôle De L'Entité

use Symfony\Component\Security\Core\Role\RoleInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="fos_role")
* @ORM\Entity(repositoryClass="UserBundle\Entity\Repository\RoleRepository")
* 
* @see User
* @see \UserBundle\Role\RoleHierarchy
* 
*/
class Role implements RoleInterface
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(name="name", type="string", length=80, unique=true)
*/
private $name;
/**
* @ORM\ManyToOne(targetEntity="Role", inversedBy="children")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", nullable=true)
* @var Role[]
*/
private $parent;
/**
* @ORM\OneToMany(targetEntity="Role", mappedBy="parent")
* @var ArrayCollection|Role[]
*/
private $children;
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="roles")
*/
private $users;
public function __construct($role = "")
{
if (0 !== strlen($role)) {
$this->name = strtoupper($role);
}
$this->users = new ArrayCollection();
$this->children = new ArrayCollection();
}
/**
* @see RoleInterface
*/
public function getRole()
{
return $this->name;
}
public function getId()
{
return $this->id;
}
public function setId($id)
{
$this->id = $id;
}
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
public function getUsers()
{
return $this->users;
}
public function addUser($user, $addRoleToUser = true)
{
$this->users->add($user);
$addRoleToUser && $user->addRole($this, false);
}
public function removeUser($user)
{
$this->users->removeElement($user);
}
public function getChildren()
{
return $this->children;
}
public function addChildren(Role $child, $setParentToChild = true)
{
$this->children->add($child);
$setParentToChild && $child->setParent($this, false);
}
public function getDescendant(& $descendants = array())
{
foreach ($this->children as $role) {
$descendants[spl_object_hash($role)] = $role;
$role->getDescendant($descendants);
}
return $descendants;
}
public function removeChildren(Role $children)
{
$this->children->removeElement($children);
}
public function getParent()
{
return $this->parent;
}
public function setParent(Role $parent, $addChildToParent = true)
{
$addChildToParent && $parent->addChildren($this, false);
$this->parent = $parent;
}
public function __toString()
{
if ($this->children->count()) {
$childNameList = array();
foreach ($this->children as $child) {
$childNameList[] = $child->getName();
}
return sprintf('%s [%s]', $this->name, implode(', ', $childNameList));
}
return sprintf('%s', $this->name);
}
}

Rôle De Type De Formulaire

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class RoleType extends AbstractType {
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('parent');
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Tanane\UserBundle\Entity\Role'
));
}
/**
* @return string
*/
public function getName()
{
return 'role';
}    
}

Si oui, ce serait ajouter à mon formulaire utilisateur devrait ressembler à quelque chose comme ceci

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('username', 'text')
->add('email', 'email')
->add('enabled', null, array(
'label' => 'Habilitado',
'required' => false
))
->add('rolesCollection', 'entity', array(
'class' => 'UserBundle:Role',
'multiple' => true,
'expanded' => true,
'attr' => array('class' => 'single-line-checks')
))
->add('groups', 'entity', array(
'class' => 'UserBundle:Group',
'multiple' => true,
'expanded' => true,
));
}

Mais je ne sais pas si c'est la bonne façon de gérer les rôles puisque dans ce cas serait de créer une nouvelle table dans ma DB appelé fos_roles où étaient les relations entre les utilisateurs/rôles est assuré, mais les relations entre les groupes et les rôles de rester en dehors de ça, puis c'est là que je suis un peu perdu et ont besoin de l'aide de l'expérience dans la que me dire et d'alerte si je suis sur la bonne voie et qu'il serait à réaliser ce que j'explique dans les deux premiers points. Toute aide ou de conseils? Comment réagissez-vous face à cela?

OriginalL'auteur ReynierPM | 2014-09-15