Intereting Posts
Отправка объекта FormData на сервер с помощью Ajax (содержит файлы) Ошибка несанкционированной ошибки 401 GCM Страница смешанного контента: запрошена небезопасная ошибка стилей Как проверить, существует ли веб-страница. jQuery и / или PHP Как частично загрузить удаленный файл с помощью cURL? PHP login session не работает на загрузке первой страницы в новом окне без кеша Разбор строки пользовательского агента мобильного телефона, хорошее решение или библиотека? PHP Использование str_replace вместе с preg_replace Количество страниц в файлах PHP MS Word codeIgniter Сообщение Javascript с сообщением об успешном обновлении Как я могу различать обновление «Сообщение» и обновление «Обратный звонок»? (Telegram Bot API) mysqli_query () ожидает как минимум 2 параметра, 1 задано в? Учетная запись службы Google Диска и «Неавторизованный клиент или область в запросе» Идентификатор ресурса №5: MySQL Форма, которая делает переадресацию браузера при доступе посредством обычной формы или запроса Ajax – возможно ли это?

Управление пользователями / ролями / группами в FOSUserBundle

Я разрабатываю простой CRUD для управления пользователями / ролями / группами приложения, в котором я работаю. Для управления пользователями я использую FOSUserBundle . То, что я хочу сделать, может быть выполнено несколькими способами:

  • Назначение ролей для групп, а затем назначение пользователей этим группам
  • Присвоение ролей пользователям напрямую

Но я понятия не имею, как это сделать. Я знал, что у класса FOSUser BaseUser уже есть роли столбца, и в документации FOSUser объясняется, как установить отношения ManyToMany между пользователями и группами, но ничего не говорить о ролях. Единственная идея, которая приходит на ум, – создать сущность для управления ролями, а также форму для той же цели, что-то вроде того, что вы видите ниже:

Роль

 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); } } 

Тип формы ролей

 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'; } } 

Если да, то что бы добавить в мою пользовательскую форму, было бы похоже на это

 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, )); } 

Но я не знаю, правильно ли это обрабатывать роли, поскольку в этом случае будет создана новая таблица в моей БД под названием fos_roles где fos_roles отношения между пользователями / ролями, но отношения между группами / ролями остаются вне этого , то это то, что я немного потерял и нуждаюсь в помощи от более опытных, которые рассказывают мне и предупреждают, если я нахожусь на пути, и это заставит их достичь того, что я объясню в первых двух моментах. Любые советы или помощь? Как вы справляетесь с этим?

Роли Symfony

Способ, которым FOSUserBundle имеет дело с Ролями, заключается в том, чтобы хранить их в столбце roles который вы видели, в сериализованном формате, таком как: a:1:{i:0;s:10:"ROLE_ADMIN";} . Поэтому нет необходимости в каких-либо других таблицах или сущностях ^.

^ Это в отличие от групп, которые должны быть явно сконфигурированы, представлены отдельной таблицей / сущностью и связаны с привязкой пользователей к группам в БД. Группы позволяют определять произвольные коллекции ролей, которые затем могут быть предоставлены каждому пользователю в виде дискретного пакета.

Пользователь может быть членом любого количества Ролей. Они идентифицируются строками, начинающимися с «ROLE_», вы можете просто начать использовать новую роль.

То, что означает Роли для вашего приложения, полностью зависит от вас, но это довольно высокоуровневый инструмент – пользователь либо находится в определенной роли, либо нет.

Вы помещаете людей в роли с помощью консоли Symfony :

 php app/console fos:user:promote testuser ROLE_ADMIN 

Или в PHP:

 $user = $this->getUser(); $userManager = $container->get('fos_user.user_manager'); $user->addRole('ROLE_ADMIN'); $userManager->updateUser($user); 

И вы можете проверить членство в PHP:

 $user = $this->getUser(); if ($user->hasRole('ROLE_ADMIN')) { //do something } 

Или используя аннотации :

 /** * @Security("has_role('ROLE_ADMIN')") */ public function adminAction() { //... 

или

 /** * @Security("has_role('ROLE_ADMIN')") */ class AdminController { //... 

Я добавил функциональность для добавления группы по умолчанию для пользователя во время регистрации, переопределив confirmAction в контроллере регистрации

Что я сделал, я переопределил регистрационный контроллер в своем проекте Bundle, определив родителя для FosUserBUndle.

Затем создала функцию confirmAction и в тело функции добавлен этот код

 $repository = $em->getRepository('AdminAdminBundle:Group'); $group = $repository->findOneByName('staff'); $em = $this->getDoctrine()->getEntityManager(); $user = $this->getUser(); $user->addGroup($group); $userManager = $this->get('fos_user.user_manager'); $userManager->updateUser($user); if (!is_object($user) || !$user instanceof FOS\UserBundle\Model\UserInterface) { throw new AccessDeniedException('This user does not have access to this section.'); } return $this->render('FOSUserBundle:Registration:confirmed.html.twig', array( 'user' => $user, )); 

И он отлично сохраняется в db с групповым назначением. Надеюсь, это поможет кому-то в этом нуждаться, поскольку информации о реализации в официальном документе fosuserbundle недостаточно.