如何在创建资源时自动将当前授权用户添加到资源中(POST
).
我正在使用 JWT 身份验证,并且 /api/ 路由受到保护,免受未经授权的用户的攻击。我想对其进行设置,以便当经过身份验证的用户创建新资源时(即通过发送POST
请求/api/articles
)新创建的Article
资源与经过身份验证的用户相关。
我目前正在使用自定义EventSubscriber
每个资源类型从令牌存储添加用户。
以下是订阅者基类的要点:https://gist.github.com/dsuurlant/5988f90e757b41454ce52050fd502273
以及扩展它的实体订阅者:https://gist.github.com/dsuurlant/a8af7e6922679f45b818ec4ddad36286
但是,如果例如实体构造函数需要用户作为参数,则这不起作用。
E.g.
class Book {
public User $owner;
public string $name;
public class __construct(User $user, string $name) {
$this->owner = $user;
$this->name = $name;
}
}
如何在实体创建时自动注入授权用户?
目前我正在使用DTO 和数据转换器.
主要缺点是必须为需要此行为的每个资源创建一个新的 DTO。
举一个简单的例子,我正在做这样的事情:
class BootDtoTransformer implements DataTransformerInterface
{
private Security $security;
public function __construct(Security $security)
{
$this->security = $security;
}
public function transform($data, string $to, array $context = [])
{
$owner = $this->security->getUser();
return $new Book($owner, $data->name);;
}
public function supportsTransformation($data, string $to, array $context = []): bool
{
if ($data instanceof Book) {
return false;
}
return Book::class === $to && null !== ($context['input']['class'] ?? null);
}
}
从逻辑上讲,这仅适用于单个资源。为了拥有一个用于多个资源的通用转换器,我最终使用一些接口来分隔“可拥有的”资源,并进行一些反射来实例化每个类。
我本以为这在非规范化阶段是可行的,但我无法让它发挥作用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)