具有可变内部路由的 Symfony 访问控制
Symfony access control with variable inside route
我在 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}
不适用于未注册用户。
我有两个解决方案给你。
首先在需要认证授权的路由中添加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')")
*/
@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 错误。
我在 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}
不适用于未注册用户。
我有两个解决方案给你。
首先在需要认证授权的路由中添加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')")
*/
@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 错误。