【问题标题】:Custom authorization check before executing controller执行控制器之前的自定义授权检查
【发布时间】:2015-11-10 07:40:31
【问题描述】:

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

示例:

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

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

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

【问题讨论】:

  • 你能解释一下你为什么要这样做吗?
  • @Frankbeen,我在更新部分添加了一些解释。希望您能理解我,如果不理解,请随时询问详细信息 =)
  • 添加 kernel.controller 监听器并检查那里的权限:symfony.com/doc/current/reference/events.html#kernel-controller
  • @Cerad 谢谢,这就是我想要的!您能否添加一个新答案并复制您的评论以便我接受。

标签: symfony authorization symfony-routing


【解决方案1】:

基本上有两种方式

  1. Security.yml

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

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

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

【讨论】:

  • 谢谢,但我实际上需要这个选项来检查用户是否可以在 KnpMenu 渲染期间访问菜单项。我已经在问题中添加了一些解释。如果我通过@Security 注释定义可以访问控制器的角色,那么我将无法在菜单呈现期间获得这些设置......或者我会?
  • @basil 我什么时候有空会去看看,希望是今天 ;)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 2020-10-14
    • 2021-04-09
    • 2019-04-06
    相关资源
    最近更新 更多