Symfony:如何根据登录用户的角色在路由上添加序列化程序组



我在实体定义中使用JMSSerializerBundle,在控制器中使用RestBundle的注释。

我有一个具有公共和管理保护属性的实体,比如

use JMSSerializerAnnotation as Serializer;
class UserAddress {
/**
* @SerializerExpose
* @SerializerGroups(groups={"address:read"})
*/
private $nonSecretAttribute;
/**
* @SerializerExpose
* @SerializerGroups(groups={"address:admin-read"})
*/
private $secretAttribute;
}

和一个用户喜欢:

class User {
// ...

/**
* @ORMOneToMany(targetEntity="UserAddress", mappedBy="user")
*/
private $addresses;

我的控制器看起来像

use FOSRestBundleControllerAnnotations as Rest;
class UsersController {
/**
* @RestGet("/users/{user}/addresses", requirements={"user"="d+"})
* @RestView(serializerGroups={"address:read"})
* @IsGranted("user_read", subject="user")
*/
public function getUsersAddresses(User $user)
{
return $user->getAddresses();
}
}

但是,如果登录的用户恰好具有ADMIN_ROLE角色,我如何将address:admin-read添加到此处的序列化程序组中?这在@RestView注释中可能吗?我有办法修改控制器方法中的组吗?在一个条件循环中验证我登录的用户的角色?

您应该手动实例化fos-restView并添加一个Context。在Context上,您可以在运行时通过评估用户角色来设置序列化组。

像这样的东西应该起作用:

use FOSRestBundleViewView;
use FOSRestBundleContextContext;
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());
}
}

最新更新