Symfony2安全系统(access_control和security.context)具有数据库存储角色和FOSUserBundle

时间:2012-06-27 20:05:32

标签: security symfony roles fosuserbundle

我使用的解决方案类似于http://blog.jmoz.co.uk/symfony2-fosuserbundle-role-entities

所以我有一个实现Role的{​​{1}}实体,并且我有一个修改过的RoleInterface实体,它被设置为与角色有一个ManyToMany关系。

这允许我使用这样的代码

User

然后,我可以检查用户是否具有

角色
$user = $this->get('security.context')->getToken()->getUser();
$role = new Role('ROLE_TEST');
$user->addRole($role);

$em = $this->getDoctrine()->getEntityManager();
$em->persist($role);
$em->persist($user);
$em->flush();

此解决方案没问题,但我需要访问安全上下文并使用如下代码:

$user = $this->get('security.context')->getToken()->getUser();

if($user->hasRole('ROLE_TEST')){
   //do stuff...
}

在security.yml cofig文件中,我想使用access_control代码,如下所示:

if($this->get('security.context')->isGranted('ROLE_TEST')){
   //do stuff...
}

我需要一个自定义用户管理器吗?分配给数据库中用户的角色不会转移到内置的Symfony安全系统。

换句话说,当我查看探查器的安全部分时,它显示用户被分配到access_control: - { path: ^/test$, role: ROLE_TEST } ,但我希望得到它,以便系统也能识别我在登录用户的数据库,例如Roles [ROLE_USER]

1 个答案:

答案 0 :(得分:1)

这不起作用的原因是因为我仍然使用相同的会话登录。注销然后再次返回以刷新具有新角色的会话就可以了。 DOH!