执行控制器之前的自定义授权检查

Custom authorization check before executing controller

我在路由设置中添加了一个新选项 roles,用于在菜单呈现期间检查菜单项的权限。
如果我能在执行相应的控制器之前使用权限检查选项就太好了。

示例:

some_route:
    path: /path/
    defaults:   { _controller: MyBundle:Controller:action }
    option:
        roles: [ROLE_MANAGER, ROLE_ADMIN]

在执行控制器本身之前,我需要根据用户的角色检查用户是否有权访问控制器。
怎么可能?有什么想法吗?

更新
为什么我需要 roles 选项?
项目中有4个不同的角色和多条路线。部分路线受到保护,仅对具有特定角色的用户可见。
目前,所有授权检查都是通过 denyAccessUnlessGranted() 方法在控制器内部执行的。
我还使用 KnpMenuBundle 来构建菜单。在菜单呈现期间,我需要检查当前登录用户的每个项目的可访问性。如果用户无权访问某个项目,则该项目将被排除并且用户看不到它。
为了检查用户是否有权访问某个项目,我添加了我提到的选项,我在其中定义了有权访问路由的角色。这个 roles 选项定义的角色与 denyAccessUnlessGranted() 中的检查完全相同。而且我认为,既然我已经有了这些角色设置,为什么不将其用于控制​​器授权检查并从中删除冗余代码。

基本上有两种方式

  1. Security.yml

    - { path: ^/path/$, roles: [ROLE_MANAGER, ROLE_ADMIN] }
    
  2. 注释直接进入控制器

    /**
     * @Security("has_role('ROLE_ADMIN') or has_role('ROLE_MANAGER')")
     */
    public function nameOfYourAction()
    

这样,controller动作执行前的第一个动作就是安全检查:如果失败,controller将不会被执行。

我知道这不是一个很好的答案,但你要求它。

添加一个 kernel.controller 侦听器并检查那里的权限。