使用Api-Platform,如何在创建时自动将授权用户添加为资源所有者?

Dan*_*ant 7 php symfony api-platform.com symfony4

如何在创建时自动将当前授权用户添加到资源 ( POST)。

我正在使用 JWT 身份验证,并且 /api/ 路由受到未授权用户的保护。我想设置它,以便当经过身份验证的用户创建新资源(即通过向 发送POST请求/api/articles)时,新创建的Article资源与经过身份验证的用户相关。

我目前正在使用EventSubscriber每个资源类型的自定义来从令牌存储中添加用户。

这是订阅者基类的要点:https : //gist.github.com/dsuurlant/5988f90e757b41454ce52050fd502273

以及扩展它的实体订阅者:https : //gist.github.com/dsuurlant/a8af7e6922679f45b818ec4ddad36286

但是,例如,如果实体构造函数需要用户作为参数,则这不起作用。

例如

class Book {

    public User $owner;
    public string $name;

    public class __construct(User $user, string $name) {
        $this->owner = $user;
        $this->name  = $name;
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在实体创建时自动注入授权用户?

D. *_*ier 0

正如 @nealio82 和 @lavb 所说,您应该看看 Gedmo\Blameable,它可以帮助您处理属性createdByupdatedBy存储User创建资源的人的位置。

Blameable StofDoctrineExtensionsBundle

然后要处理访问,请查看 Voters,它对于处理安全性和不同的访问非常有用。

关于投票者的官方 Symfony 文档


例如

图书实体

...
use Gedmo\Mapping\Annotation as Gedmo;

class Book {

    ...

    /**
     * @var string $createdBy
     *
     * @Gedmo\Blameable(on="create")
     * @ORM\Column
     */
    public User $owner;

    public function getOwner() {
        return $this->owner;
    }

    public function setOwner(User $owner) {
        $this->owner = $owner
    }
}
Run Code Online (Sandbox Code Playgroud)

src/安全/投票者/BookVoter

...
use Gedmo\Mapping\Annotation as Gedmo;

class Book {

    ...

    /**
     * @var string $createdBy
     *
     * @Gedmo\Blameable(on="create")
     * @ORM\Column
     */
    public User $owner;

    public function getOwner() {
        return $this->owner;
    }

    public function setOwner(User $owner) {
        $this->owner = $owner
    }
}
Run Code Online (Sandbox Code Playgroud)