php - Symfony 访问控制与路由内部变量

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

不适用于未注册的用户。

最佳答案

我有两个解决方案给你。

首先,将 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')")
 */

关于php - Symfony 访问控制与路由内部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34857736/

相关文章:

php - Symfony 安全注销未清除 RememberMe token

symfony - 无法更新实体

php - CodeIgniter DataMapper 表名覆盖不起作用

php - 如何在WampServer版本3.0.6 32位中更改mysql密码

symfony - 如何获取twig文件的内容

php - 忽略并继续处理特定的 Symfony2 kernel.exception 事件

php - CodeIgniter PHP MySQL 查询查看

php - 用户类型的登录面板问题

javascript - 将 Php 数组作为 Javascript 数组值传递

symfony - 阻止 Symfony3 上已登录用户的登录页面