php - 如何在 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
默认情况下会调用该文件。
解决方案
/admin
access_control URL 是前缀 - 因此,在通常情况下,它们是, 或所必需的/admin/some-other-page
。因此,正在触发和检查 /test 的检查,但不检查 /test2 - 您可以首先检查最具体的路径,并首先列出 /test2。
对于安全投票者,您无需在 access_control 中特别提及 - 它已列出,因此将进行安全检查 - 在您上面的代码块中,检查就在那里列出 - '是角色 IF_USER_AGREED_CONDITIONS? '。如果它没有明确列出,它将回退查看支持哪些选民,选民$subject
将是 a 的一个实例,Request
就像您在控制器中轻松获得一个一样。'是否支持'的检查是a)它是aRequest
和b)$subject->getUri();
开始'/test2'。
当对主题的这两项检查都为真时 - 然后您可以进行主要检查 - 用户是否同意这些条件。
推荐阅读
- android - 当用户在 onPostExecute 上获得结果时,从 AsyncTask 打开第二个活动
- android - 安卓。缩放布局,其中包含 2 个 web 视图
- c++ - 在现有 C++ cmake 项目中使用 libtensorflow_cc.so
- oauth - 资源服务器如何知道我的熊访问令牌是有效的
- android - 如何在后台将检测到的 Beacon 信息的详细信息发送到服务器?
- c# - 将 InvokeMember 与 WPF WebBrowser HTMLElement 一起使用会引发异常
- c# - 如何在 GridViewColumn 中绑定文本对齐
- angular - Angular - 修改 app.component.html 中的组件属性
- apache-spark - 如何在火花中选择名称中带有引号的数据框中的列
- python - 使用 Flask-SQLAlchemy 的领域特定查询语言