首页 > 解决方案 > 如何在 Symfony 3 的安全文件中使用选民

问题描述

我创建了一个特殊选民来检查允许或不允许用户访问我网站的一部分的条件。

我成功地以这种方式在控制器内测试了我的选民,它正在工作。

$this->denyAccessUnlessGranted(UserVoter::IF_USER_AGREED_CONDITIONS, $user);

security.yml文件中,有一部分允许控制对某些页面的访问,这取决于使用的角色。

access_control:
- { path: ^/test, roles: IS_AUTHENTICATED_FULLY }
- { path: ^/test2, roles: IF_USER_AGREED_CONDITIONS }

当我尝试使用我的特殊选民做同样的事情时,框架每次都会向我显示错误页面(如果该页面不允许用户出现,则应该出现该页面),无论条件是否满足。

关键是我不想修改我所有的控制器来添加这一行,因为security.yml默认情况下会调用该文件。

标签: phpsymfony

解决方案


/adminaccess_control URL 是前缀 - 因此,在通常情况下,它们是, 或所必需的/admin/some-other-page。因此,正在触发和检查 /test 的检查,但不检查 /test2 - 您可以首先检查最具体的路径,并首先列出 /test2。

对于安全投票者,您无需在 access_control 中特别提及 - 它已列出,因此将进行安全检查 - 在您上面的代码块中,检查就在那里列出 - '是角色 IF_USER_AGREED_CONDITIONS? '。如果它没有明确列出,它将回退查看支持哪些选民,选民$subject将是 a 的一个实例,Request就像您在控制器中轻松获得一个一样。'是否支持'的检查是a)它是aRequest和b)$subject->getUri();开始'/test2'。

当对主题的这两项检查都为真时 - 然后您可以进行主要检查 - 用户是否同意这些条件。


推荐阅读