当前位置: 首页 > 知识库问答 >
问题:

为collectionOperations实现ApiResource安全筛选器规则

邵繁
2023-03-14

是否有可能在实体上实现ApiResource安全性,以便没有实体id的GET请求(即集合操作)只返回与当前已验证用户匹配的项(或为此目的,必须针对每个实体检查的任何其他规则)?

我到目前为止的实现:

/**
 * @ORM\Entity(repositoryClass=UserRepository::class)
 * @ORM\Table(name="`user`")
 * @ApiResource(
 *     attributes={"security"="is_granted('ROLE_USER')"},
 *     collectionOperations={"get"={"security"="is_granted('ROLE_ADMIN') or object == user"}},
 *     itemOperations={"get"={"security"="is_granted('ROLE_ADMIN') or object == user"}},
 *     )
 */
class User implements UserInterface
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private ?int $id;

   // ...

}

上面的代码适用于项操作,但不适用于集合运算符,即假设用户ID。%1(非管理员)已通过身份验证:

  • get/api/user/1返回用户#1数据200 OK(根据需要)
  • get/api/user/2返回403禁止(根据需要,用户1应该无法获取其他用户的数据)。
  • get/api/user返回403禁止(不像所希望的那样,所希望的行为是返回一个仅包含传递规则的实体的列表,即用户#1的数据)。

共有1个答案

苏浩瀚
2023-03-14

对此使用教义扩展。这不是一个安全问题,您不希望限制对资源的访问,而是希望修改返回的结果。

例如,匆忙修改链接单据上的示例:

final class CurrentUserExtension implements QueryCollectionExtensionInterface
{
    private $security;

    public function __construct(Security $security)
    {
        $this->security = $security;
    }

    public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null): void
    {
        if (User::class !== $resourceClass
            || $this->security->isGranted('ROLE_ADMIN')
            || null === $user = $this->security->getUser())
        {
            return;
        }

        $rootAlias = $queryBuilder->getRootAliases()[0];
        $queryBuilder->andWhere(sprintf('%s.id = :current_user', $rootAlias));
        $queryBuilder->setParameter('current_user', $user->getId());
    }

}
 类似资料:
  • 关于searchview,我有一个简单的问题--我在我的菜单中创建了searchview项,我有功能gridview,但我不知道如何在onCreateOptionMenu中完成我的代码--它不会识别我的GridAdapter。以下代码 gridAdapter是我的gridview的适配器,但它显示为红色,这是我不明白的。顺便说一句:即使在OnCreateOptionsMenu中添加了这两行,应用程

  • 我试图创建一个安全过滤器,以排除某些用户在ElasticSearch中看到某些文档。例如,如果一个文档包含“abc:123”和“abc:xyz”,那么用户的配置文件中必须同时包含这两个文档才能查看该文档。我们正在使用小胡子模板创建这个动态。我的第一次尝试是这样的: 但是,我很快意识到,这将允许拥有一个控件的用户查看具有多个控件的文档。文档必须具有用户必须匹配的控件的子集。因此,如果用户只有“abc

  • 我正在实现一个基于java的指数量表,它将有一个初始值(比如1.0),并在时间上呈指数衰减到0。另一个功能将不时增加仪表值。现在我需要一些帮助来开发线程安全的。 我正在考虑使用java计时器或执行器来创建衰减功能,该功能将每隔5毫秒降低仪表的值。同时,另一个函数在被调用时会增加值。 现在我假设它会有并发问题,所以需要帮助来正确实现它。 我的问题是: > 如何设计一个类,该类将执行函数以每5毫秒减少

  • 首先,我试图使选择所有复选框,如果我单击表头中的选择所有复选框,整个表行将选择并显示一个复选框反向消息,即我选择了多少复选框。这里的问题是,如果我单击select all复选框,反向消息不会显示楼上的表,即我选择了多少行。 其次,如果我从任何列中筛选任何数字,相同的数字将显示同一列中有多少行具有相同的数字。如果我选中了所有复选框,那么反向消息将显示我选中了多少行复选框。这里,问题是显示整个表行计数

  • https://github.com/azure/azure-service-bus/tree/master/samples/dotnet/gettingstart/microsoft.azure.servicebus/topicsubscriptionwithruleoperationssample 现在我想添加一个筛选器/规则,这样只有通过筛选器中定义的特定条件的消息才应该给订阅。 例如,下面

  • 介绍 我注意到我们项目中的推送过滤器都不起作用。它解释了为什么执行时间受到影响,因为它读取了数百万次,而它应该将它减少到几千次。为了调试这个问题,我编写了一个小测试,读取CSV文件,过滤内容(下推过滤器)并返回结果。 它不能与CSV一起工作,所以我尝试读取一个拼花文件。没有一个能用的。 数据 文件具有以下结构: 名词(noun的缩写)镶木地板文件有相同的结构 读取CSV文件 为了重现这个问题,我编