ApiPlatform - 在子资源路由上实现安全授权
创始人
2024-09-08 02:00:13
0

要在ApiPlatform的子资源路由上实现安全授权,可以使用Symfony的安全授权功能。以下是一个具体的解决方法,包含代码示例:

  1. 在主资源的实体类中添加一个子资源关联属性。例如,如果有一个Book实体类和一个Chapter实体类,可以在Book实体类中添加一个chapters属性:
use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ApiResource
 * @ORM\Entity
 */
class Book
{
    // ...

    /**
     * @ORM\OneToMany(targetEntity="Chapter", mappedBy="book")
     */
    private $chapters;

    public function __construct()
    {
        $this->chapters = new ArrayCollection();
    }

    public function getChapters(): Collection
    {
        return $this->chapters;
    }

    // ...
}
  1. 在子资源的实体类中添加一个主资源关联属性。在上面的例子中,可以在Chapter实体类中添加一个book属性:
use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ApiResource
 * @ORM\Entity
 */
class Chapter
{
    // ...

    /**
     * @ORM\ManyToOne(targetEntity="Book", inversedBy="chapters")
     * @ORM\JoinColumn(nullable=false)
     */
    private $book;

    public function getBook(): ?Book
    {
        return $this->book;
    }

    public function setBook(?Book $book): self
    {
        $this->book = $book;

        return $this;
    }

    // ...
}
  1. 创建一个自定义的数据提供器(data provider),用于对子资源进行安全授权。可以使用Symfony的安全授权功能来实现。以下是一个示例的数据提供器:
use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
use ApiPlatform\Core\DataProvider\SubresourceDataProviderInterface;
use ApiPlatform\Core\Exception\ResourceClassNotSupportedException;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\Security;

class SecureSubresourceDataProvider implements SubresourceDataProviderInterface, RestrictedDataProviderInterface
{
    private $security;

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

    public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
    {
        return true; // 支持所有子资源
    }

    public function getSubresource($data, array $identifiers, string $property, array $context = [])
    {
        // 检查授权
        if (!$this->security->isGranted('ROLE_ADMIN')) {
            throw new AccessDeniedException('Access denied.');
        }

        // 根据需要实现自定义的子资源逻辑
        // 在这里,你可以查询数据库或调用其他服务来获取子资源数据。

        // 返回子资源数据
        return $data->{$property};
    }
}
  1. services.yaml文件中注册自定义的数据提供器:
services:
    App\SecureSubresourceDataProvider:
        arguments:
            - '@security.authorization_checker'
  1. 在ApiPlatform的配置文件api_platform.yaml中指定使用自定义的数据提供器:
api_platform:
    mapping:
        paths: ['%kernel.project_dir%/src/Entity']
    collection:
        data_provider: 'api_platform.collection_data_provider'
    subresource:
        data_provider: 'App\SecureSubresourceDataProvider'

以上就是在ApiPlatform的子资源路由上实现安全授权的解决方法,包含了相应的代码示例。请根据自己的需求进行相应的修改和调整。

相关内容

热门资讯

2026外挂!雀友会广东潮汕麻... 2026外挂!雀友会广东潮汕麻将辅助软件,芒果辅助器(好像是有挂)1、用户打开应用后不用登录就可以直...
2026外挂!哈糖大菠萝辅助,... 2026外挂!哈糖大菠萝辅助,奇迹手游辅助脚本平台免费(一直真的有挂)1、奇迹手游辅助脚本平台免费脚...
2026外挂!辅助定制交易平台... 2026外挂!辅助定制交易平台,情怀破解(本来有挂)1、起透看视 辅助定制交易平台辅助软件价格2、随...
2026外挂!九酷众游软件,5... 2026外挂!九酷众游软件,510k中至余干辅助(原来真的是有挂)1、玩家可以在510k中至余干辅助...
2026外挂!极速官方游戏暗堡... 2026外挂!极速官方游戏暗堡辅助器,楚天游辅助(其实存在有挂)1、上手简单,内置详细流程视频教学,...
2026外挂!免费游戏辅助软件... 2026外挂!免费游戏辅助软件,如何设置钱塘十三水辅助器(切实是真的有挂)1、2026外挂!免费游戏...
2026外挂!雀姬辅助脚本,微... 2026外挂!雀姬辅助脚本,微乐游戏辅助脚本安装(切实有挂)2026外挂!雀姬辅助脚本,微乐游戏辅助...
2026外挂!飞驰娱乐软件科技... 2026外挂!飞驰娱乐软件科技,科乐填大坑辅助器(切实真的有挂)1、科乐填大坑辅助器免费辅助多个强度...
2026外挂!皮皮胡子辅助,天... 2026外挂!皮皮胡子辅助,天天贵阳破解版(原来是真的有挂)天天贵阳破解版是不是有人用挂微扑克wpk...
2026外挂!科技实测欢乐辅助... 2026外挂!科技实测欢乐辅助,丽水都莱辅助软件(都是是有挂)小薇(辅助器软件下载)致您一封信;亲爱...