对许多实体使用一类 Voter

2023-11-29

这是函数支持类课堂上的选民

http://symfony.com/doc/2.5/cookbook/security/voters_data_permission.html

 public function supportsClass($class)
{
    $supportedClass = 'AppBundle\Entity\Post';

    return $supportedClass === $class || is_subclass_of($class, $supportedClass);
}

我想知道是否可以对同一捆绑包中的多个实体使用一个类投票器,或者我必须为每个实体创建一个投票器?

EDIT我找到了这个解决方案:

 public function supportsClass($class)
{
    $classes = array(
        'Project\AgenceBundle\Entity\Agence',
        'Project\AgenceBundle\Entity\SubAgence',
        'Project\AgenceBundle\Entity\Subscription'
    );
    $ok = false;
    foreach($classes as $supportedClass)
    $ok = $ok || $supportedClass === $class || is_subclass_of($class, $supportedClass);

    return $ok;
}

简而言之,是的,您可以根据需要重复使用您的选民。例如,您的投票者可以针对界面进行工作。

但是,您不应该仅仅为了节省几行代码而使用 voter 来判断太多事情。也许投票者可以判断一组不是派生类但有共同点的对象。这反过来又是界面和特征的好地方。因此,选民应该针对该界面进行工作。 这就是接口的用途,为您提供合同。

如果你有一系列的类supportsClass比将来你改变其中一个的一些东西。您可能会破坏该类的 Voter,但由于它不受接口绑定,因此静态分析或 PHP 解释器不会捕获它。这是一个很大的问题。

如你看到的Voter由 3 部分组成。

  • 支持类它告诉 Symfony 这是否Voter可以决定某个类别的对象。
  • 支持属性它告诉 Symfony 这是否Voter可以决定此行动。
  • vote根据传递的对象决定是否是/否/不知道

This is 不完全是怎么运行的。但它应该让你知道选民的目的是什么。

You:

//You in controller
 if (!$this->get('security.context')->isGranted('edit', $object)) {
     throw new AuthenticationException('Not a step furher chap!');
 }

框架:

//security.context
//again it is rough idea what it does for real implementation check Symfoy github
public function isGranted($action, $object) {
  //There it goes trough all voters from all bundles!
  foreach ($this->voters as $voter) {
      if (!$voter->supportsClass(get_class($object))) {
          //this voter doesn't care about this object
          continue;
      }

      if (!$voter->supportsAttribute($action)) {
          //this voter does care about this object but not about this action on it
          continue;
      }

      //This voter is there to handle this object and action, so lest se what it has to say about it
      $answer = $voter->vote(..);
      ...some more logic
  }
}

我脑海中浮现出一个奇怪的例子:

interface Owneable {
    public function getOwnerId();
}

trait Owned {

    /**
     * @ORM....
     */ 
    protected $ownerId;

    public function getOwnerId() {
        return $this->ownerId;
    }

    public function setOwnerId($id) {
        $this->ownerId = $id;
    }
}

class Post implements Owneable {
   use Owned;
}

class Comment implements Owneable {
   use Owned;
}

class OwnedVoter implements VoterInterface
{

    public function supportsAttribute($attribute)
    {
        return $attribute === 'edit';
    }

    public function supportsClass($class)
    {
        //same as return is_subclass_of($class, 'Owneable');
        $interfaces = class_implements($class);
        return in_array('Owneable' , $interfaces);
    }

    public function vote(TokenInterface $token, $ownedObject, array $attributes)
    {
        if (!$this->supportsClass(get_class($ownedObject))) {
            return VoterInterface::ACCESS_ABSTAIN;
        }


        if (!$this->supportsAttribute($attributes[0])) {
            return VoterInterface::ACCESS_ABSTAIN;
        }


        $user = $token->getUser();
        if (!$user instanceof UserInterface) {
            return VoterInterface::ACCESS_DENIED;
        }




        $userOwnsObject = $user->getId() === $ownedObject->getOwnerId();
        if ($userOwnsObject) {
            return VoterInterface::ACCESS_GRANTED;
        }


        return VoterInterface::ACCESS_DENIED;
    }
}

提示:Voter 和其他类一样,都是类,继承和抽象类之类的东西也可以在这里工作!

TIP2:Voter 已注册为您可以传递的服务security.context或任何其他服务。所以你可以很好地重用你的代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对许多实体使用一类 Voter 的相关文章

  • 使用 PHPSpreadsheet 打开受密码保护的 XLSX 文件

    我正在尝试打开受密码保护的 Excel 文件 xlsx PHP电子表格 https github com PHPOffice PhpSpreadsheet 文档 https phpspreadsheet readthedocs io en
  • UNIX时间记录时区吗?

    我想问一下UNIX时间 UNIX时间是否记录时区 我将托管从美国芝加哥移至 JST 问题是我的整个 MySQL 数据库都有 UNIX 时间 芝加哥 美国时区 的记录 我有一个 PHP 代码来显示之前的时间 例如 3 天前 昨天等 当我搬到新
  • 如何用PHP进行有向图绘制?

    我正在寻找一种在 PHP 中绘制有向图的方法 如http upload wikimedia org wikipedia commons 0 08 Directed acirclic graph png http upload wikimed
  • 对对象数组进行排序

    我在使用 PHP 手册中的示例时遇到了问题 所以我想在这里问这个 我有一个对象数组 有没有办法根据对象的内容对其进行排序 例如我的数组是 Array 0 gt stdClass Object id gt 123 alias gt mike
  • 如何使用 HHVM proxygen 重写规则忽略任何文件?

    我创建一个这样的文件example ini hhvm server type proxygen hhvm server default document index php hhvm virtual host default rewrite
  • 获取过时的 Composer 软件包列表

    我想获取过时的软件包列表 这些软件包将在我发布时更新composer update 作曲家有这样的功能吗 如果没有 有没有办法做到这一点 有或没有作曲家 Update Since Composer v1 1 2016 年 5 月 https
  • PHP中特殊字符的转换

    我已经尝试了很多功能 但我根本无法弄清楚这一点 无论如何 正确的方法 在称为描述的表单字段中 我可以期待各种字符 在将它们提交到数据库之前 需要将它们格式化为 HTML 实体 现在 我的代码 formdesc htmlentities PO
  • 如何通过 API 平台使用“paramconverter”?

    如何通过 Symfony API 平台实现或使用 paramconverter 我想在路线上使用实体 ID 并立即生成一个对象 准备在控制器中使用 我没有在这个项目上使用注释 路由配置位于 YAML 文件中 resources App Me
  • 需要有关使用 PHP 在 mysql 数据库中插入逗号分隔数据的帮助

    数据库表中已有的演示数据 INSERT INTO csvtbl ID SKU Product Name Model Make Year From Year To VALUES 1 C2AZ 3B584 AR Power Steering P
  • 验证数据库匹配中的 $_GET id 是否足够安全?

    我的网站上有 2 个页面 一个是 index php 索引页面列出了数据库中存在的所有帖子 另一个页面是 post php 当单击索引页面上的特定帖子时 帖子页面显示单个帖子 现在我用来列出 index php 上所有帖子的代码是 post
  • 如何在 Cakephp 3 中创建按字段集分组的多个复选框

    我在阅读本文档时遇到问题 Cakephp3 Cookbook 表单 创建选择选择器 http book cakephp org 3 0 en views helpers form html creating select pickers我尝
  • php在html页面中创建额外空间

    我是网络开发新手 我真的被这个愚蠢的问题困扰了 当我在 html 代码之前插入 php 代码时 如下所示 它在我的页面顶部创建了额外的空白空间 并将整个内容 推下 是否有可能以某种方式避免创建额外的空间 如果 php 代码位于 html 的
  • PHP - 发送带有附件的电子邮件不显示消息内容

    尝试创建一个脚本 我可以在其中发送带有附件的电子邮件 一切正常 除了当我不在电子邮件中添加文件时 我仍然可以看到带有 0B 且没有名称的附件 if isset POST my send email to POST my email to r
  • 通过 PHP 使用 Eclipse BIRT 报表设计器

    我想在 php web 项目中使用 Birt Reports 因此我安装了推荐的 Java Bridge 和 BIRT Runtime 将 JavaBridgeTemplate621 war 和 birt war 移至我的 Tomcat 之
  • 使用 PHP 5.3 ?: 运算符

    有了这个测试页 page int GET page 1 echo page 我不明白页面未定义时得到的输出 Request Result page 2 2 page 3 3 page 1 error Undefined index page
  • 何时以及为何应使用 $_REQUEST 而不是 $_GET / $_POST / $_COOKIE?

    标题中的问题 当所有 3 个都发生时会发生什么 GET foo POST foo and COOKIE foo exist 其中哪一个被包含到 REQUEST 我想说永远不会 如果我想通过各种方法设置某些内容 我会为每个方法编写代码以提醒自
  • 从数据库生成 XML 时出现 PHP 编码错误 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试获取一个简单的 PHP 服
  • php 崩溃后 mysql 表被锁定

    我有一个 MySQL DB 和一个 innoDB 表 我有一个 php 页面 用于连接 锁定表 进行一些更新 然后解锁表 PHP 页面通过 wamp 与 apache 一起提供 php页面将文件上传到数据库 我决定通过上传一个大小大于分配给
  • 如何以 Magento 方式实现库存过滤器?

    在我的 magento 网站上可以看到缺货的产品 我想要在分层导航中添加一个自定义过滤器 其中显示 排除缺货 当客户单击它时 应该隐藏缺货产品 默认情况下 我在 系统 gt 配置 gt 目录 gt 库存 下启用显示 显示缺货产品 即我希望客
  • 如何在 Laravel 中创建一条包罗万象的路线

    我需要一个 Laravelroutes php将捕获所有流量到特定的条目example com premium section网站 以便我可以提示人们在访问优质内容之前成为会员 您还可以通过在参数上使用正则表达式来捕获 全部 Route g

随机推荐

  • iTextSharp CreateInk 方法:曲线和角

    我正在使用 iTextSharp 使用 PdfAnnotation CreateInk 在 PDF 文档中绘制标记图形 我正在尝试绘制矩形 并传入五个坐标的数组 我知道 iTextSharp 有一个专门用于绘制矩形的函数 但我尝试仅使用一种
  • 如何在 macOS 上从源代码构建 docker-ce

    有人知道是否有从源代码构建并用其替换 Mac 上的 docker 二进制文件的指南吗 自述文件没有说所以我尝试了一些 make target 但得到了https github com docker for mac issues 3353 E
  • 如何避免数据库死锁?

    一些数据库功能 例如SELECT FOR UPDATE and ON DELETE CASCADE 隐式地容易受到死锁的影响 因为数据库没有指定将使用什么锁定顺序 我发现two 讨论这暗示 SQL 标准并未指定此行为 更不用说具体的实现了
  • MongoDB 更新数组元素

    我有一个像这样的文档结构 id ObjectId 52263922f5ebf05115bf550e Fields Field Lot No Rules Field RMA No Rules 我尝试通过使用以下代码推入将保存对象的规则数组来进
  • android - For 循环中的 R.string.[variable]?

    我正在尝试创建一个R string variable in a for循环可以节省我很多代码行 我尝试过这个 但它不起作用 在 strings xml 中 我有这些
  • Ionic 2 中的页面过渡动画

    我有简单的选项卡模板 Ionic 3 应用程序 其中每当用户根据左或右在视图上滑动时 我都会在选项卡之间切换我会在选项卡和所有工作正常之间切换 接受点击选项卡发生页面转换时没有动画效果或通过滑动屏幕 我正在获取页面推送和弹出的动画 this
  • 如何在 Entity Framework Core 中正确播种具有循环依赖关系的数据?

    首先 我使用 Entity Framework Core 在 NET Core 3 1 中 和代码优先方法 想象一下我有几个这样的实体 public class Employee Key Required public int Id get
  • 如何通过 bash 中的变量传递带空格的命令行参数[重复]

    这个问题在这里已经有答案了 我想要实现的是从文件中读取命令行参数并使用它们调用命令 所以本质上我需要通过 bash 变量传递参数 问题是有些参数中有空格 我怎样才能做到这一点 不工作的代码 来说明问题 file txt 内容 引号只是为了显
  • 使用互操作在 Word 2010 中按样式查找段落

    有人可以给我指出正确的方向 或者告诉我如何使用 c net 中的单词互操作按样式名称查找段落 尝试这样的循环 using WN Microsoft Office Interop Word WN Application WordApp Wor
  • ui 选择 angularjs 设置输入值的最大长度(ui 选择匹配)

    我想要一个额外的属性 就像从 ui select match 传递的 Placeholder 一样 我想设置选择输入的最大长度 我可以通过 select min js 添加属性 maxlength 设置它 但我认为对 lib 进行更改 文件
  • 更新电子邮件验证状态而不重新加载页面

    在我的网络应用程序中注册后 我将用户重定向到一个页面 告诉他验证他的电子邮件 一旦他这样做了 我想自动检测验证状态的变化 然后更改页面 沿着这些思路 auth user subscribe user gt if user user emai
  • WsFederation 身份验证登录循环

    我在使用时遇到登录循环问题WsFederation Authentication在我的 MVC Web 应用程序中 我使用 Visual Studio 创建 Web 应用程序的脚手架并设置WsFederation in the Startu
  • 查找所有子元素的最大值并在 XSLT 中获取其父元素

    使用下面的 XML 我需要找出哪个人在每个站点工作的时间更长 例如 在下面的 XML 中 人员 1 在站点 1 工作了 8 小时 但人员 2 仅工作了 6 小时 因此 结果应包含转换后的 XML 中的人员 1 和站点 1 如果时间相等 则选
  • 签出旧提交并将其设为新提交[重复]

    这个问题在这里已经有答案了 在 Git 上 假设我搞乱了我的提交 并且我想将版本 3 之前的提交作为新版本 如果我做git checkout xxxx 它创建了一个新分支 似乎我只能合并它 我可以将其设为新的 主版本 吗 I want A
  • jQuery 手风琴 - 当打开另一个手风琴窗格时如何折叠其他打开的手风琴窗格

    我有一个手风琴 我希望具有以下功能 当用户单击链接展开时 其他展开的链接 如果有 将折叠 我知道这个功能是内置在手风琴插件中的 但我试图避免添加另一个库 jQuery UI 编辑 这是我现在拥有的代码 这里位于 jsFiddle 上 htt
  • Objective-C 运行时函数的线程安全保证?

    Objective C 运行时函数的线程安全有哪些保证 有吗 我说的是在runtime h中声明的函数 例如class lookupMethod objc setAssociatedObject 其中很多都是线程安全的 调配等等 但也有一些
  • 如何将SqlAlchemy结果序列化为JSON?

    Django 有一些很好的自动序列化功能 可以将 ORM 模型从 DB 返回为 JSON 格式 如何将SQLAlchemy查询结果序列化为JSON格式 I tried jsonpickle encode但它对查询对象本身进行编码 我试过js
  • Angular 2:从父组件获取RouteParams

    如何从父组件获取 RouteParams App ts Component RouteConfig path component HomeComponent as Home path username component ParentCom
  • 在“for”循环中绘制几张不同大小的图片

    我是 knitr 和 markdown 的新手 这是我问的第一个问题 也许这个问题有一个我找不到的简单答案 我有一个 for 循环 它创建了 3 个 ggplots 根据数据输入 循环运行 300 到 400 次 我想将这3张图片的大小定义
  • 对许多实体使用一类 Voter

    这是函数支持类课堂上的选民 http symfony com doc 2 5 cookbook security voters data permission html public function supportsClass class