Symfony2:isGranted for other entity

时间:2013-04-06 11:56:43

标签: php symfony security fosuserbundle

我的应用程序具有以下角色层次结构:

  
      
  • ROLE_SUPER_ADMIN   
        
    • ROLE_ADMIN   
          
      • ROLE_USER
      •   
    •   
  •   

我有我的控制器使这项工作:

/**
 * @Route("/admin/delete/{id}", name="_admin_delete")
 * @Secure(roles="ROLE_ADMIN")
 */
public function deleteuserAction($id)
{
    $user = $this->container->get('fos_user.user_manager')->findUserBy(array('id' => $id));
    if (null === $user) {
        throw $this->createNotFoundException('User id not found');
    }

    if ($user->hasRole('ROLE_ADMIN')) {
        // You can not delete this user!
        throw new ...
    }

    // delete user
    $this->container->get('fos_user.user_manager')->deleteUser($user);

    // ...
}

所有拥有ROLE_ADMIN的人都可以访问deleteuserAction ..但我希望他们无法删除具有ROLE_ADMIN HIGHER 角色的用户。

有一种正确的方法吗?

使用此配置,您可以删除ROLE_SUPER_ADMIN ...是的,您可以将其添加到列表中以阻止它,但是使用复杂的层次结构可能会变得难以管理。

1 个答案:

答案 0 :(得分:1)

如果您不想使用ACL,另一个选项是创建一个处理您的层次结构的自定义选民。这里描述了一个基本选民:http://symfony.com/doc/current/cookbook/security/voters.html