PHP / REST - 如何实现基于角色的API访问?

问题描述 投票:2回答:2

我已经使用以API为中心的方法启动了一个PHP项目(项目管理项目跟踪工具)并且已经取得了相当不错的开端。

我创建了2个GET方法到目前为止我想限制访问但不知道从哪里开始。

在我的数据库的上下文中

  • Project是封装不同动作项的容器。
  • Actionitems被“分配”给user
  • Users存在于数据库中。
  • Roles分配给用户。 (UserAdminSuper

  • 用户只能更新自己的项目
  • 管理员已创建并更新权限
  • Super拥有全部管理权限

我的问题是:我应该从PHP开始,只允许通过适当的用户访问api,通过登录api或其他方式?任何帮助入门都会让我开始。

首先,我已经使用JSON字符串成功创建了一个端点来访问访问资源(actionitems)来测试响应。

我想限制的现有端点

GET /api/actionitems/

使用通用结构访问表中的特定资源,如下所示:

GET /api/actionitems/4

请注意,应按如下方式访问其他api端点

每条路由最多3个路由令牌(在/ api /之后)

GET /api/users/123/actionitems   (get all actionitems for user 123)


GET /api/users/123/actionitems?<more-filers> applies further filtering
php rest api rbac
2个回答
1
投票

您需要处理API的身份验证和授权。

这些是了解解决方案的基本步骤:

  • 客户端使用用户凭据(用户名,密码)调用登录API。
  • 服务器验证用户凭据并生成令牌。
  • 服务器将此令牌存储在数据库中以防止经过身份验证的用户ID并响应客户端。
  • 服务器已具有授权角色权限,可访问与数据库中此经过身份验证的用户关联的不同API。
  • 客户端使用登录API提供的令牌调用资源API。
  • 服务器验证数据库中的令牌,并获取针对此令牌的用户和用户角色权限以进行授权。
  • 资源API根据经过身份验证的用户角色权限授权并提供所需数据或执行操作。

有多种方法可以通过标准化方式实现这一目标:


1
投票

你可能想看看JWT令牌https://jwt.io/

这是一些快速的信息

  • 带有令牌的API是无状态的,您必须在每个请求上发送令牌,通常在授权头中,令牌可以包含有效负载,其中包含一些数据,如用户ID创建和到期时间。
  • 在服务器端,当您收到带有请求的令牌时,您只需在有效负载内找到用户ID,然后在数据库中找到相应的用户。由于在没有私钥的情况下无法修改令牌,因此您可以信任您收到的数据。
  • 然后,您可以检查用户是否具有某些管理员或超级管理员角色,或者该项目是否属于他并发送正确的响应。

注意:令牌中的有效负载是公共的,这意味着每个人都可以阅读它,不要提供任何敏感的信息。

如果要使用某些长期身份验证,可以将刷新令牌与jwt令牌一起使用,它们存储在数据库中,可用于创建新的jwt令牌。

希望这可以提供帮助。

© www.soinside.com 2019 - 2024. All rights reserved.