具有可变内部路由的Symfony访问控制

时间:2016-01-18 14:59:04

标签: 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_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}

对未注册的用户不起作用。

2 个答案:

答案 0 :(得分:4)

我有两个解决方案。

首先,将alias | grep python添加到需要身份验证和授权的路由中。然后,只需将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

答案 1 :(得分:4)

所有答案来自@ turdaliev-nursultan work。

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

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

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

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

另请注意,使用http://example.com/ad/foo/contact之类的任何网址(参数不是现有ID)都会导致出现http 404错误。