我遵循了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;
}