Symfony,允许访问除一个(或两个)

时间:2017-03-12 15:50:44

标签: php symfony

我是Symfony 3的新手。我正在尝试配置用户和管理员可以访问的路由。我有两个角色:ROLE_USERROLE_ADMIN,我已将security.xml配置如下:

role_hierarchy:
    ROLE_ADMIN: ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN


access_control:
    - { path: ^/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/, role: ROLE_ADMIN }
    - { path: ^/, role: ROLE_USER }

我想允许ROLE_ADMIN个用户访问除login以外的所有路由。 我希望允许ROLE_USER用户访问除loginadmin之外的所有路由

我不确定原因,但看起来所有ROLE_ADMIN个用户也会收到ROLE_USER。我已将ROLE_USER设置为访问所有路由(在其路径中设置^/),其中包含/admin/login路由。

问题是:如何设置正确禁止ROLE_USER访问/admin/login路由的路径?

1 个答案:

答案 0 :(得分:4)

  

我不知道为什么,但看起来所有ROLE_ADMIN用户也会收到   ROLE_USER

嗯,这就是角色层次结构的含义,你自己写了ROLE_ADMIN: ROLE_USER。因此,由于管理员拥有比用户更多的权限,因此您无法限制他访问用户资源。

我不知道为什么你想要这种行为,但你可以通过控制器中的解决方法实现它。类似的东西:

/**
 * @Route("/login", name="login")
 */
public function loginAction()
{
   $context = $this->container->get('security.context');

   $user = $context->getToken()->getUser();

   $admin = $context->isGranted('ROLE_ADMIN');

   if ( $admin ){
       //hey I'm an admin, please redirect me to the correct ressource
   }

   if (  $user  ){ 
       //hey I'm a simple user, what do you want me to do ?
   }    
}