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
Vous devez vous connecter pour publier un commentaire.
Symfony Rôles
La façon FOSUserBundle traite avec des Rôles est de les stocker dans la
roles
colonne que vous avez vu, dans un format sérialisé comme ceci:a:1:{i:0;s:10:"ROLE_ADMIN";}
. Donc il n'y a pas besoin d'autres tables ou des entités^.^ Ceci est en contraste à des Groupes, qui doivent être configurés de manière explicite, sont représentés par un Tableau distinct/de l'Entité, et n'impliquent relatives aux Utilisateurs à des Groupes dans la DB. Les groupes vous permettent de définir des ensembles arbitraires de Rôles qui peuvent ensuite être donné à chaque Utilisateur comme un discret bundle.
Un Utilisateur peut être membre d'un certain nombre de Rôles. Ils sont identifiés par les chaînes de caractères commençant par "ROLE_", vous pouvez simplement commencer à utiliser un nouveau Rôle.
Quels sont les Rôles signifie pour votre application est complètement à vous, mais ils sont tout à fait un outil de haut niveau - un Utilisateur dans un Rôle particulier ou qu'ils ne le sont pas.
Vous mettre les gens dans des Rôles soit par l'intermédiaire de la Symfony console:
Ou en PHP:
Et vous pouvez tester l'appartenance à PHP:
Ou à l'aide de Les Annotations:
ou
OriginalL'auteur frumious
J'ai ajouté la possibilité d'ajouter de groupe par défaut de l'utilisateur lors de l'inscription en remplaçant la confirmAction dans l'Enregistrement Contrôleur
Ce que j'ai fait c'est surdéfinie l'Enregistrement de Contrôleur dans mon projet Bundle en définissant le parent de FosUserBUndle .
Ensuite créé une fonction confirmedAction et dans le corps de la fonction ajout de ce code
Et il a parfaitement enregistré dans la bd avec l'attribution d'un groupe.
Espère que cela va aider quelqu'un dans le besoin, comme il ya peu d'informations sur la mise en œuvre officielle fosuserbundle doc.
OriginalL'auteur neeraj