我在物體定義中使用 JMSSerializerBundle,在控制器中使用 RestBundle 的注釋。
我有一個具有公共和管理員保護屬性的物體,比如說
use JMS\Serializer\Annotation as Serializer;
class UserAddress {
/**
* @Serializer\Expose
* @Serializer\Groups(groups={"address:read"})
*/
private $nonSecretAttribute;
/**
* @Serializer\Expose
* @Serializer\Groups(groups={"address:admin-read"})
*/
private $secretAttribute;
}
和像這樣的用戶:
class User {
// ...
/**
* @ORM\OneToMany(targetEntity="UserAddress", mappedBy="user")
*/
private $addresses;
我的控制器看起來像
use FOS\RestBundle\Controller\Annotations as Rest;
class UsersController {
/**
* @Rest\Get("/users/{user}/addresses", requirements={"user"="\d "})
* @Rest\View(serializerGroups={"address:read"})
* @IsGranted("user_read", subject="user")
*/
public function getUsersAddresses(User $user)
{
return $user->getAddresses();
}
}
infos:admin-read但是如果登錄的用戶碰巧有這個ADMIN_ROLE角色,我怎么能在這里添加到序列化程式組?@Rest\View注釋中可能嗎?我是否有辦法在控制器方法中修改組,在條件回圈中驗證我的登錄用戶角色?
uj5u.com熱心網友回復:
View您應該手動實體化 fos-rest并添加一個Context. 在此之上,Context您可以通過評估用戶角色在運行時設定序列化組。
像這樣的東西應該作業:
use FOS\RestBundle\View\View;
use FOS\RestBundle\Context\Context;
class UsersController
{
public function getUsersAddresses(User $user): View
{
$isAdmin = in_array('ROLE_ADMIN', $user->getRoles());
$context = new Context();
$context->setGroups($isAdmin ? ['address:admin-read'] : ['address:read']);
$view = VVV::create()->setContext($context);
return $view
->setContext($context)
->setData($user->getAddresses());
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/448586.html
上一篇:如何使用JWT令牌驗證路由?
下一篇:.env檔案中何時需要引號?
