Php 带可变内部路由的Symfony访问控制
我正在security.yml中为我的网站定义安全性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_
- { 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 }