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

时间:2014-04-23 22:38:24

标签: php symfony roles user-roles

我已经关注了Symfony2 Security documentation并让实体,数据库和表单做了他们的事情。麻烦的是,我的数据库中没有任何用户,因此我完成了Registration Documentation中的步骤,但在我看来,这些应该更好地连接。注册文档没有说明角色。在我看来,分配默认角色的最佳时间是在用户注册期间。这就是我之后的事情,但考虑到用户实体没有任何添加角色的方法,我对如何做到这一点有点失落。我的问题是如何在注册期间为用户分配一个默认角色(" ROLE_USER")?

相关守则:

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

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

UserRepository:http://pastebin.com/BLfAjgkt

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

signupCreateAction是我怀疑应该发生魔法的地方,或者可能是在用户实体的__construct()方法中。我只是迷失了正确的方法。

3 个答案:

答案 0 :(得分:1)

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

/**
 * ...
 */
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事件订阅者,它实际上会在persist上获取默认角色(因此,在注册期间)。这在Doctrine documentation上有详细记载。

要注册活动订阅者,您应该查看Symfony documentation

答案 1 :(得分:0)

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

FOSUserBundle提供了管理用户所需的大部分内容。

答案 2 :(得分:0)

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

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