Symfony2在注册期间分配用户角色


Symfony2 Assigning User Roles During Registration

我遵循了Symfony2 Security文档,并让实体、数据库和表单完成它们的工作。问题是我的数据库中没有任何用户,所以我完成了注册文档中的步骤,但在我看来,这些应该更好地连接。注册文档对角色只字未提。在我看来,分配默认角色的最佳时间是在用户注册期间。这就是我想要的,但考虑到用户实体没有任何添加角色的方法,我有点不知所措。我的问题是,在注册期间,如何将存储在数据库中的默认角色("role_USER")分配给用户?

相关代码:

用户实体:http://pastebin.com/zi8nWGb8

角色实体:http://pastebin.com/Q8D5kB0A

用户存储库:http://pastebin.com/BLfAjgkt

注册和登录操作:http://pastebin.com/rdbAcBXu

signupCreateAction是我怀疑魔术应该发生的地方,或者可能发生在用户实体的__construct()方法中。我只是不知道该怎么做。

首先有两件事。您需要为这两个类创建访问器方法。这意味着创建:

/**
 * ...
 */
class TblUser
{
    // ...
    public function getRoles()
    {
        return $this->roles->toArray();
    }
    public function setRoles(Collection $roles)
    {
        foreach ($roles as $role) {
            $this->addRole($role);
        }
    }
    public function addRole(TblPrivilege $role)
    {
        if (!$this->roles->contains($role)) {
            $this->roles->add($role);
            $role->addUser($this);
        }
    }
    public function removeRole(TblPrivilege $role)
    {
        if ($this->roles->contains($role)) {
            $this->roles->removeElement($role);
            $role->removeUser($this);
        }
    }
}
/**
 * ...
 */
class TblPrivileges
{
    // ...
    public function getUsers()
    {
        return $this->users;
    }
    public function setUsers(Collection $users)
    {
        foreach ($users as $user) {
            $this->addUser($user);
        }
    }
    public function addUser(TblUser $user)
    {
        if (!$this->users->contains($user)) {
            $this->users->add($user);
        }
    }
    public function removeUser(TblUser $user)
    {
        if ($this->users->contains($user)) {
            $this->users->removeElement($user);
        }
    }
}

对于实际调用$user->addRole()方法,我实际上会选择一个Doctrine事件订阅者,它实际上会在persistent(因此在注册期间)获取默认角色。这在条令文件中有很好的记录。

要注册事件订阅者,您应该查看Symfony文档:

我使用FOSUserBundle来管理用户和角色。他们有一个名为Groups的工具,可以让您管理数据库中的角色。也就是说,这应该不难滚动自己。

FOSUserBundle提供了管理用户所需的大部分功能。

您也可以在用户实体中尝试

private $roles = array();
/**
 * Returns the roles or permissions granted to the user for security.
 */
public function getRoles()
{
    $roles = $this->roles;
    // guarantees that a user always has at least one role for security
    if (empty($roles)) {
        $roles[] = 'ROLE_USER';
    }
    return array_unique($roles);
}
public function setRoles($roles)
{
    $this->roles = $roles;
}