【问题标题】:Do I need to write seperate APIs endpoint for each user role?我是否需要为每个用户角色编写单独的 API 端点?
【发布时间】:2016-06-04 12:37:37
【问题描述】:

我的应用中有两个不同角色的用户,学生和管理员。每个用户都有一个 team_id 字段引用,它告诉用户它属于哪个团队。在这种情况下,我的数据库由这些表组成:用户、团队。

为了显示团队详细信息,我有一个如下 API: 获取:api/teams/{team_id}

public function show($id)
    {
        $team = $this->teamService->findById($id);
        if ($team) {
            return response()->json(['message' => 'Success', 'success' => true, 'status' => 200, 'data' => $team]);
        } else {
            return response()->json(['message' => 'Error', 'success' => true, 'status' => 404, 'data' => null]);
        }
    }

这仅适用于管理员,因为 $id 作为参数传递到 url,这意味着只有管理员可以输入任何 $id,而普通用户必须根据他们所属的团队自动关联 id(所以在这种情况下,我想显示他们所属团队的团队详细信息)。

所以在这种情况下,我的 api 应该如下所示: 获取:api/团队

public function show()
        {
            $team = $this->teamService->findById(Auth->user->team_id); //associate the team id for user logged in
            if ($team) {
                return response()->json(['message' => 'Success', 'success' => true, 'status' => 200, 'data' => $team]);
            } else {
                return response()->json(['message' => 'Error', 'success' => true, 'status' => 404, 'data' => null]);
            }
        }

所以我的最后一个问题是,有没有什么办法可以将这两个角色放在一个地方.. 这样就不会有不同角色的重复功能。

在这种情况下,API 应该是什么样子?

谢谢

【问题讨论】:

  • 你不能只使用 if 语句吗?如果if(Auth::user()->role == 'admin'){$team = $this->teamService->findById($id);} else { the other query}
  • @AchrafKhouadja,我也是这么想的,但是如果是普通用户,为什么我需要在url上传递一个$id,我的意思是url上的id似乎没用,我应该如果它的普通用户总是将它传递给 null?
  • 那么您可以使用中间件,如果是,则检查用户是否是管理员 -> 重定向到仅限于管理员使用 id 的路由(也使用中间件)或重定向到普通路由用户无需将 id 添加到 url

标签: php api laravel


【解决方案1】:

我需要为每个用户角色编写单独的 API 端点吗?

不,绝对不是。

在这种情况下,API 应该是什么样子?

没有“正确”的答案,但这里有两个想法:

1) 用户对象应该有指向您的团队对象的链接:

{ name: "bob", team_link: "/team/3" }

然后你的/team/:id 路由应该检查“如果你不是管理员用户,如果用户不在这个团队中,则给出 404。”

2) 如果您真的认为用户需要获取他们自己的团队信息,您可以使用/team 路由。但以上更标准。或者,提供指向真实团队对象的链接。 (为什么?因为它使缓存变得更容易。)

【讨论】:

  • 你是说 API 应该是这样的:teams/{id},对,如果是这样,如果我从普通用户调用,我应该将什么作为 id 作为 id 传递,我应该作为 null 传递给网址?所以电话将是:团队/空?这对我来说似乎很奇怪。请问您能否解释一下您的第一个选项?谢谢!
  • 是的,选项 #1 是“teams/{id}”。我是说其他一些 API 调用应该告诉用户他们所在团队的特定 URL。 (例如,如果用户获取他们自己的对象,或者可能获取其他状态,则它具有指向您的团队的链接)。 .. 另一方面,如果“获取我的团队数据”是第一个 API 调用,那么您可以使用“/team”路由。
  • 所以我们有两条路线,对吧? /team 和 /team/{id}?一个用于普通用户,一个用于管理员?我不太确定我是否理解你...
  • 你可以有 2 条路线,但最好不要。例如,当用户登录时,您可以告诉他们“您的团队路线是/team/432”。客户端将其存储在本地,并在它想要查找团队信息时记住它。服务器仍然会进行安全检查(“您是这个团队的所有者,还是您是管理员?”),但是您不需要多个路由到同一数据位。
猜你喜欢
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多