Php 带可变内部路由的Symfony访问控制

Php 带可变内部路由的Symfony访问控制,php,symfony,symfony-security,Php,Symfony,Symfony Security,我正在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_

我正在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
文件中。这样,您就不需要手动添加所有管线

第二,将路线更改为:

mybundle_contact_advertiser:
   path:    /ad/contact/{id}
   defaults:   { _controller: MyBundle:Default:contactAdvertiser}
然后将以下内容添加到
security.yml
文件中:

- { path: ^/ad/contact/, role: ROLE_USER  }
但是,如果您不想更改路线,请检查
操作中的授权

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

最后但并非最不重要的一点是,您可以使用
@Security
注释来保护您的操作

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

来自@turdaliev nursultan工作的所有答案

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

您可以编辑
security.yml
文件,并将以下规则添加到
access\u control
列表中:

- { path: ^/ad/[0-9]+/contact$, role: ROLE_USER }
[0-9]+
部分表示由0到9之间的一个或多个数字组成的任何字符串


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

您不需要将每个路由添加到安全性中。yml有通配符,它将像在正则表达式中一样,扫描路由的哪个子部分需要经过身份验证的用户,哪个路由不需要。。。此外,如果你把一个参数放在你的路线中间,你的路线可以是/ad /空/接触…你真的想要吗?为什么不将参数设置为可选?如果参数可以为nullTrue,那么它不应该为null。发现
^/ad/(.+)/contact
同时也起作用。我知道你的大部分选择,不想修改我的路线。注释的使用没有真正意义,因为我不想同时使用注释和.yml。要么是一个,要么是另一个。@geogeirimiciuc,谢谢分享,我不知道在路由安全中使用regex。今天学到了一些新东西。这可能是无效的yaml。您可以在正则表达式周围使用单引号,以防止yml解析器在遇到正则表达式时抛出错误
- { path: ^/ad/[0-9]+/contact$, role: ROLE_USER }