2014-04-23 34 views
0

我已经遵循Symfony2 Security documentation并且拥有实体,数据库和表单。麻烦是我的数据库中没有任何用户,所以我完成了Registration Documentation中的步骤,但在我看来这应该是更好的连接。注册文档没有提到角色。在我看来,分配默认角色的最佳时机是在用户注册期间。这就是我所追求的,但考虑到用户实体没有任何添加角色的方法,我在如何做到这一点上有点失落。我的问题是,如何在注册期间为用户分配存储在数据库中的默认角色(“ROLE_USER”)?Symfony2在注册期间分配用户角色

相关代码:

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

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

UserRepository:http://pastebin.com/BLfAjgkt

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

的signupCreateAction是我怀疑魔法应该发生或pe可能在用户实体的方法__construct()中。我只是失去了正确的方式来做到这一点。

回答

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

对于实际调用$用户> addRole()方法,我真的走了学说事件的用户,这实际上会取默认角色的坚持(因此,在注册过程中) 。这在Doctrine documentation上有详细记录。

要注册一个事件订户,你应该看看Symfony documentation

+0

我已经应用了所有代码(谢谢)和事件订阅者也是如此。我的第一个问题是,我怎么知道prePersist甚至被称为一个新的实体,而不仅仅是一个更新?我还没有第二个问题,但我相信当我进一步研究这个问题的时候。 –

+0

下一个问题:因为我正在处理一个空的数据库,某些属性没有定义(TblPrivilege-> users)。当我尝试将用户添加到TblPrivilege时,出现错误。什么是确保这些属性被实例化的最佳方式。我想只是检查addUser方法,如果用户是有效的,如果没有实例化它。 –

+0

使用您的建议得到了这项工作。我想知道你是否可以给我上述2个问题的答案。谢谢 –

0

我使用FOSUserBundle来管理用户和角色。他们有一个名为Groups的设施,可让您管理数据库中的角色。这表示这不应该很难推出自己。

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

+0

如果他不需要FosUserBundle的所有biavior他能做与fos默认角色所做的一样: https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Model/User.php 请参阅hasRole getRole和setRole – alexises

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; 
} 
相关问题