从自定义调用API平台的默认操作?

时间:2019-03-15 13:05:42

标签: php api symfony api-platform.com

我正在研究安全区域。花了几天时间在Symfony和API平台文档上后,我意识到我的关注点在于细节。 谈到Symfony中的安全性,我认为对于小型或内部项目而言,这很酷。我们可以根据需要添加/删除个人资料/角色。

我想做点特别的事。我希望用户或客户端(不是开发人员)能够通过后台,添加新的配置文件并分配权限。我使用安全区域而不是直接使用角色。我想在安全区域下保护我的动作(控制器)。

每个控制器都获得“ getSecurityZone()”方法,该方法可以让我首先检查该事件(内核事件),以查看当前用户是否对资源具有权限(取决于其唯一角色/配置文件)。

public function securityZone(): string
{
    return 'BO_ZONE';
}

我的担心:我不想重写逻辑来检索数据,因为API平台已经做到了。所以我试图使用事件来运行我的安全检查。看来可行,但是如何从我的操作中调用默认操作(如GET)?

我的实体:

 *      },
 *      collectionOperations={
 *          "get"={
 *              "method"="GET",
 *              "path"="/users",
 *              "controller"=UserListAction::class,
 *              "defaults"={"_api_receive"=false},
 *              "swagger_context"={
 *                  "parameters"={
 *
 *                  }
 *              },
 *          },
 *          "post"
 *      }
 * )
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @ORM\Table(name="users")
 */
class User implements UserInterface
{

我的事件监听器:

public static function getSubscribedEvents()
{
    return [
        KernelEvents::VIEW => ['encodePassword', EventPriorities::PRE_WRITE],
        KernelEvents::CONTROLLER => ['micheckSecurity', EventPriorities::PRE_READ],
    ];
}

//..

public function micheckSecurity(FilterControllerEvent $event)
{
    $controller =  $event->getController();
    $method = $event->getRequest()->getMethod();

    if (Request::METHOD_GET !== $method || $controller->getSecurityZone() !== Constants::SECZONE_BO_ZONE)
        throw new AccessDeniedException("You are not author", 500);
    return;
}

还有我的动作(控制器):

class UserListAction
{
    public function __invoke()
    {
        //Call default operation which return collection
    }

    public function securityZone(): string
    {
        return 'BO_ZONE';
    }

}

在我的_invoke()方法中,我想调用API Platform的read方法,该方法将自动返回集合。

感谢您的关注。

0 个答案:

没有答案