gpt4 book ai didi

php - 在 FOSUserBundle 中管理用户/角色/组

转载 作者:可可西里 更新时间:2023-10-31 22:53:46 25 4
gpt4 key购买 nike

我正在开发一个简单的 CRUD 来管理我正在工作的应用程序的用户/角色/组。为了管理用户,我使用了 FOSUserBundle。我想做的事情可以通过几种方式完成:

  • 将角色分配给组,然后将用户分配给这些组
  • 直接为用户分配角色

但是我不知道怎么办。我知道 FOSUser BaseUser 类已经有一个列 roles 并且在 documentation 中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 的新表,其中处理用户/角色之间的关系但是团队/角色之间的关系不在其中,那是我有点迷茫的地方,需要经验丰富的人的帮助,告诉我并提醒我是否走上正轨,这将使他们实现我在前两点。有什么建议或帮助吗?你如何处理这个问题?

最佳答案

Symfony Roles

FOSUserBundle 处理 Roles 的方式是将它们存储在您看到的 roles 列中,序列化格式如下:a:1:{i:0;s :10:"ROLE_ADMIN";.所以不需要任何其他表或实体^。

^ 这与需要显式配置的组形成对比,由单独的表/实体表示,并且确实涉及将用户与数据库中的组相关联。组让您可以定义任意的角色集合,然后可以将这些角色作为一个离散的包提供给每个用户。

一个用户可以是任意数量的角色的成员。它们由以“ROLE_”开头的字符串标识,您可以开始使用新角色。

角色对您的应用程序意味着什么完全取决于您,但它们是相当高级的工具 - 用户要么处于特定角色,要么不处于特定角色。

您可以通过 Symfony console 将人员置于角色中:

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
}

或使用 Annotations :

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

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

关于php - 在 FOSUserBundle 中管理用户/角色/组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25857472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com