0

我正在尝试结合 Symfony 本身编写一个授权系统。我的逻辑是这样的:

  1. 有一个User表谁保存系统用户。
  2. 有一张Role桌子负责角色。
  3. 有一个Permission表格保存网站的每个部分的权限。
  4. 有一个User_Role表格告诉我们哪个用户是哪个角色。
  5. 有一个Role_Permission表定义了每个角色的权限。

我已经在数据库中创建了表及其关系。并将它们导入 Symfony(创建的实体)。

现在的问题是:

/**
* @inheritDoc
*/
public function getRoles()
{
    return array('ROLE_TEST');
}

如何在角色数组中加载每个用户的角色?

4

2 回答 2

1
public function getRoles()
{
    $roles = array();
    // Checking that the user has permissions attached
    if ($this->getPermissions() !== null)
    {
        // Looping on the permissions
        foreach($this->getPermissions() as $permission)
        {
            // Checking that the permission has roles attached
            if ($permission->getRoles() !== null)
            {
                // Looping on the roles for each permission
                foreach($permission->getRoles() as $role)
                {
                    $roles[] = $role->getName();
                }
            }
        }
    }
    return $roles;
}

更好的解决方案是创建一个 UserManager 服务并通过 Doctrine Query Builder 获取角色(减少对数据库的调用):

/** @var EntityManager $this->em */
$roles = $this->em->createQueryBuilder()
    ->select('r')
    ->from('AcmeBundle:Role', 'r')
    ->innerJoin('r.permissions', 'p')
    ->innerJoin('p.users', 'u')
    ->where('u = :user')
    ->setParameter(':user', $user)
    ->getQuery()
    ->getResult()
;
于 2013-11-12T13:59:37.590 回答
0

感谢 Guillaume Verbal,我找到了另一个解决方案。我创建了一个视图,它只返回用户 ID 和用户角色(按视图制作 4 个表),最后在 user 和 user_role(view) 表之间建立逻辑关系。一切正常。

于 2013-11-17T14:47:21.007 回答