带有变量内部路由的 Symfony 访问控制

Posted

技术标签:

【中文标题】带有变量内部路由的 Symfony 访问控制【英文标题】:Symfony access control with variable inside route 【发布时间】:2016-04-23 19:14:21 【问题描述】:

我在 security.yml 中为我的网站定义安全性

    -  path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY 
    -  path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY 
    -  path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY 
    -  path: ^/ad/new, role: ROLE_USER  
    -  path: ^/myAds, role: ROLE_USER  
    -  path: ^/payments, role: ROLE_USER  
    -  path: ^/pay, role: ROLE_USER  

但我不确定如何在此处添加这样的路线:

mybundle_contact_advertiser:
   path:    /ad/id/contact
   defaults:    _controller: MyBundle:Default:contactAdvertiser,id:null

考虑到我不能这样做,id 是如何定义的:

    -  path: ^/ad, role: ROLE_USER  

像一条路线

mybundle_ad:
    path:      /ad/id
    defaults:   _controller: MyBundle:Default:viewAd ,id:null

不适用于未注册用户。

【问题讨论】:

您不需要将每条路由都添加到 security.yml 中,有通配符可以像在正则表达式中一样扫描路由的哪个子部分需要经过身份验证的用户,而哪个路由不需要......此外,如果您在路线中间放置一个可以为 null 的参数,您的路线可以是 /ad/null/contact ...您真的想要吗?如果可以为null,为什么不将参数设为可选 没错,它不应该为空。 【参考方案1】:

@turdaliev-nursultan 的所有答案都有效。

但如果您知道id 参数将始终是一个整数,那么还有一个可能的答案。

您可以编辑security.yml 文件并将以下规则添加到access_control 列表中:

-  path: ^/ad/[0-9]+/contact$, role: ROLE_USER 

[0-9]+ 部分表示由 0 到 9 的一个或多个数字组成的任何字符串。

还请记住,使用任何 url,如 http://example.com/ad/foo/contact,其中参数不是现有 id,将导致 http 404 错误。

【讨论】:

这可能是无效的 yaml 你可以在正则表达式周围使用单引号来防止 yml 解析器在遇到正则表达式时抛出错误【参考方案2】:

我有两个解决方案。

首先,在需要认证和授权的路由中添加prefix。然后只需将 prefix 添加到您的 security.yml 文件中。这样您就不需要手动添加所有路由。

其次,将路线更改为:

mybundle_contact_advertiser:
   path:    /ad/contact/id
   defaults:    _controller: MyBundle:Default:contactAdvertiser

然后将以下内容添加到您的security.yml 文件中:

-  path: ^/ad/contact/, role: ROLE_USER  

但是,如果您不想更改路线,请检查您的 action 中的授权

 $this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Unable to access this page!');

或者

if (!$this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) 
    throw $this->createAccessDeniedException();

最后但同样重要的是,您可以使用 @Security 注释来保护您的操作。

/**
 * @Security("has_role('ROLE_USER')")
 */

【讨论】:

发现^/ad/(.+)/contact 同时也有效。我知道你的大部分选择,不想修改我的路线。注释的使用并没有真正的意义,因为我真的不想将注释和 .yml 结合起来。这是一个或另一个。 @GeorgeIrimiciuc,谢谢分享,我不知道在路由安全中使用正则表达式。今天学到了一些新东西。

以上是关于带有变量内部路由的 Symfony 访问控制的主要内容,如果未能解决你的问题,请参考以下文章

从 Symfony 请求中获取路由并将其传递给包含的 twig 文件?

ACL访问控列表之标准版

Symfony2 自定义选民:无法从选民内部访问 getDoctrine

symfony2 获取路由参数(控制器参数与请求)

访问 Symfony2 控制器中未映射的字段

ACL标准访问控制列表