Symfony2:检查旧ROLE返回true

时间:2014-08-04 11:58:40

标签: php symfony fosuserbundle

我在项目中使用FOSUserBundle。注册后,如果用户具有FOSUB提供的默认角色ROLE_USER,我会检查以下功能。

 /**
  * Returns true if user has ROLE_USER
  *
  * @return boolean 
  */
 public function hasDefaultRole() {
     return ($this->hasRole('ROLE_USER'));
 }

如果此函数返回true,我会设置一个新的帐户注册表单,并在提交时更改角色并删除ROLE_USER

编辑

$user = $this->container->get('security.context')->getToken()->getUser();
...
$userManager = $this->container->get('fos_user.user_manager');
$user->removeRole("ROLE_USER");
$user->setRoles(array("ROLE_TEACHER", "ROLE_TEACHER_BASIC"));
$user->setStatus(1);
$userManager->updateUser($user);
$this->resetToken($user);

restetToken执行此操作:

 $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
 $this->container->get('security.context')->setToken($token);

我已检查过数据库,并且不再有角色用户了。如果我退出并再次登录,$user->hasDefaultRole()仍然返回true。我在这里看不到什么?或者这是预期的行为?

1 个答案:

答案 0 :(得分:2)

FOSUserBundle始终将默认角色(ROLE_USER)添加到角色列表中,以确保用户始终至少具有角色,因此无论您做什么,都无法将其删除。

FOSUserBundle \模型\用户

/**
 * Returns the user roles
 *
 * @return array The roles
 */
public function getRoles()
{
    $roles = $this->roles;

    foreach ($this->getGroups() as $group) {
        $roles = array_merge($roles, $group->getRoles());
    }

    // we need to make sure to have at least one role
    $roles[] = static::ROLE_DEFAULT;

    return array_unique($roles);
}

FOSUserBundle \模型\的UserInterface

const ROLE_DEFAULT = 'ROLE_USER';

此外,您永远不会在数据库中找到ROLE_USER,因为它从未真正添加它。

FOSUserBundle \模型\用户

public function addRole($role)
{
    $role = strtoupper($role);
    if ($role === static::ROLE_DEFAULT) {
        return $this;
    }

    if (!in_array($role, $this->roles, true)) {
        $this->roles[] = $role;
    }

    return $this;
}