4

我在 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}

不适用于未注册用户。

4

2 回答 2

10

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

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

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

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

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

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

于 2017-03-21T16:10:37.483 回答
4

我有两个解决方案给你。

首先,添加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')")
 */
于 2016-01-18T17:58:59.230 回答