如何防止访问 Symfony 2 中的特定路由

Posted

技术标签:

【中文标题】如何防止访问 Symfony 2 中的特定路由【英文标题】:How to prevent access to specific routes in Symfony 2 【发布时间】:2014-12-31 03:04:43 【问题描述】:

我是 symfony2 的新手,我不了解 security.yml 的工作方式

我的应用程序中有 2 个角色:ROLE_USER、ROLE_ADMIN。

ROLE_USER:只能查看(不能 CRUD) ROLE_ADMIN:可以做任何事情(可以 CRUD)

我有两个基本问题:

    app/config 中是否只有 1 个 security.yml?我可以为我的包 ThePartner\EZFBundle\Resource\config 创建一个 security.yml,我可以在其中指定角色可以访问的路由吗?

    我想阻止 ROLE_USER 访问路由 blue_form_new、blue_form_create、blue_form_edit、blue_form_update、blue_form_delete?此 ROLE_USER 只能访问 blue_form、blue_form_show

这是我的 ThePartner\EZFBundle\Resources\routing.yml

ThePartnerEZFBundle_blue_form:
    resource: "@ThePartnerEZFBundle/Resources/config/routing/blueform.yml"
    prefix:   /blue_form

这里是 ThePartnerEZFBundle/Resources/config/routing/blueform.yml

blue_form:
    pattern:  /
    defaults:  _controller: "ThePartnerEZFBundle:BlueForm:index" 

blue_form_show:
    pattern:  /id/show
    defaults:  _controller: "ThePartnerEZFBundle:BlueForm:show" 

blue_form_new:
    pattern:  /new
    defaults:  _controller: "ThePartnerEZFBundle:BlueForm:new" 

blue_form_create:
    pattern:  /create
    defaults:  _controller: "ThePartnerEZFBundle:BlueForm:create" 
    requirements:  _method: post 

blue_form_edit:
    pattern:  /id/edit
    defaults:  _controller: "ThePartnerEZFBundle:BlueForm:edit" 

blue_form_update:
    pattern:  /id/update
    defaults:  _controller: "ThePartnerEZFBundle:BlueForm:update" 
    requirements:  _method: post|put 

blue_form_delete:
    pattern:  /id/delete
    defaults:  _controller: "ThePartnerEZFBundle:BlueForm:delete" 
    requirements:  _method: post|delete 

谢谢大家

【问题讨论】:

【参考方案1】:

您只需要配置您的security.yml。您可以定义多个适用于不同路由的防火墙:

security:
    firewalls:
        your_first_firewall:
            pattern: /public/ #this is regexp, so all urls starting with /public/ will   match
            security: false #this will be public, no firewall
        your_second_firewall:
            pattern: /nonPublic/
            security: true

请记住,您的防火墙条目的顺序很重要 - 第一个匹配的模式将“获胜”。

您还可以从捆绑包中导入安全设置。为此,您需要在主 config.yml 中导入捆绑包的 security.yml 文件 - 描述为 here)

# app/config/config.yml
imports:
    -  resource: '@AcmeDemoBundle/Resources/config/security.yml' 

【讨论】:

谢谢托马斯!我按照链接导入一个空的 security.yml。但是有一个错误提示无法从“/Users/anhnch/Documents/working/easyform/src/app/config/config.yml”导入资源“@ThePartnerEZFBundle/Resources/config/security.xml”。确保“ThePartnerEZFBundle”包已正确注册并加载到应用程序内核类中。虽然我确实在 AppKernel 中正确注册了包(它是由命令行生成的) 是因为导入是在bundle注册之前发生的吗? 不,这里与订单无关。您确定该文件存在(带有 xml 扩展名)吗?要么文件不存在,要么包未正确加载(或名称不合适) - 没有其他选项 我的错,我错误地导入了security.xml而不是security.yml。非常感谢 Tomasz :)

以上是关于如何防止访问 Symfony 2 中的特定路由的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Symfony 5.1 不能识别“routes.php”文件中配置的路由?

Symfony 子域路由

防止未经授权的用户直接访问上传的文件 - Symfony

Symfony 原则防止特定实体的记录删除

如何强制用户注销 symfony2

如何在 symfony2 中禁用某些路由的监听器?