在Symfony2中,如何获得用户的完整角色列表

时间:2016-09-13 20:28:36

标签: symfony security-context

我想将经过身份验证的用户角色列表传递给我的前端应用程序,因此我可以在前端和后端使用相同的访问控制结构。

我正在查看安全/身份验证类,因为isGranted函数对我来说是这样做的

 <?php
if (isset($_POST['checkbox1'])) {
    echo "Hello world!";
}
?>

我找不到任何可以获得角色列表的内容,这不是受支持的功能吗?

nb:我不想要整个角色层次结构,只需要经过身份验证的用户的角色列表

2 个答案:

答案 0 :(得分:2)

我最终添加了一个新的存储库功能和一个服务方法来获取此信息。

MyProject的/ UserBundle /实体/存储库/ UserRepository

public function getRoles($userId)
{
    $queryBuilder = $this->createQueryBuilder('u');
    $queryBuilder
        ->select('u.id, u.roles AS user_roles, g.roles AS group_roles')
        ->leftJoin('u.groups', 'g')
        ->andWhere('u.id = :user_id')
        ->setParameter('user_id', $userId);

    return $queryBuilder->getQuery()->getArrayResult();
}

MyProject的/ UserBundle /服务/ UserService

public function getUserRoles($user)
{
    $groupRoles = $this->repository->getRoles($user->getId());

    $roles = array('user_roles' => array(), 'group_roles' => array());
    foreach ($groupRoles as $groupRole) {
        $roles['user_roles'] = array_merge($roles['user_roles'], $groupRole['user_roles']);
        $roles['group_roles'] = array_merge($roles['group_roles'], $groupRole['group_roles']);
    }

    return $roles;
}

这给了我一个像这样的数组

"roles":{
    "user_roles":[],
    "group_roles":["ROLE_ADMIN","ROLE_ONE","ROLE_TWO","ROLE_BEST"]
}

答案 1 :(得分:1)

假设您正在使用Symfony安全组件,那么您的用户类实现的用户界面已包含:

$user = $this->get('security.token_storage')->getToken()->getUser();
var_dump($user->getRoles());

http://api.symfony.com/3.1/Symfony/Component/Security/Core/User/UserInterface.html#method_getRoles