gpt4 book ai didi

rest - 如何实现基于角色的 REST API

转载 作者:行者123 更新时间:2023-12-04 02:19:25 24 4
gpt4 key购买 nike

我在我的项目中有两个不同的角色:ROLE_USERROLE_ADMIN
我想通过 REST API url '/users' 获取所有用户的列表,但是某些字段(例如 email)只能看到那些使用 ROLE_ADMIN 进行身份验证的人。
所以,我通常有 2 个问题:

1) 根据ROLE我应该在哪个抽象级别(MVC 模式)决定返回哪些信息
2) 在 Symfony 中实现这种基于角色的 REST API 的最佳方式是什么?


谢谢

最佳答案

如果您使用的是 JMSSerializer,则可以使用组来决定可以看到或不可以看到的内容。然后在您的 Controller 中,或任何地方,您可以根据角色设置组。

例如映射(在 YAML 中)..

Fully\Qualified\Class\Name:
exclusion_policy: ALL
properties:
id:
groups: [user]
userAndAdmin:
groups: [user]
adminOnly:
groups: [admin]

然后在您的 Controller 中,您可以将组设置为...

public function getUsersAction(Request $request)
{
$users = $this->getRepository()->findAll();
$serializer = $this->get('jms_serializer.serializer');

$json = $serializer->serialize(
$users,
'json',
SerializationContext::create()->setGroups($this->generateGroups())
);

return new Response($json);

// If you are using FOSRestBundle, which I would recommend, then you would just need to do...
$view = $this
->view($this->getRepository()->findAll();)
->setExclusionGroups($this->generateGroups())
;

return $this->handleView($view);
}

private function generateGroups()
{
$securityContext = $this->get('security.context');
$groups = array();

if ($securityContext->isGranted('ROLE_USER')) {
$groups[] = 'user';
}

if ($securityContext->isGranted('ROLE_ADMIN')) {
$groups[] = 'admin';
}

return $groups;
}

虽然整个“generateGroups”和设置组最好放在客户 View 处理程序或响应生成器中。

假设您的层次结构将 ROLE_ADMIN 作为 ROLE_USER 的父级,您将获得以下结果。

ROLE_USER

{
"users": [
{
"id": 1,
"userAndAdmin": "val"
}
]
}

ROLE_ADMIN

{
"users": [
{
"id": 1,
"userAndAdmin": "val",
"adminOnly": "val"
}
]
}

关于rest - 如何实现基于角色的 REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31999790/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com