[英]Restful api design for admin and non admin accounts
面临如何为管理员和非管理员帐户设计 api 的问题。 我遵循 MVC 模式,其中控制器将映射到 uri。
化妆场景:
假设我有一个系统,允许用户在花钱购买商品并收集积分后兑换礼物。
我的系统有一个用户配置文件、礼物和兑换表。 每个用户可以兑换多个礼物,每个礼物可以被多个用户兑换。 (Redeem 是连接表)。
要访问用户配置文件,uri 将如下所示:
GET /user/0001
兑换礼物
POST /user/0001/redeem {"amount":1, "address":"old address"}
到目前为止,一切都看起来很整洁。 现在当兑换需要管理员用户批准时出现问题
所以要将兑换更新为已批准状态
PUT /user/0001/redeem/100 {"status":"approve"}
用户可以更新礼物将运送到的送货地址
PUT /user/0001/redeem/100 {"address":"New address"}
现在我面临以下问题:
如果我在 uri (admin/user/0001/redeem/100) 前面添加一个管理员。 2 不同的路径将标识相同的资源。
识别用户身份是在授权标头 (Authorization="USERNAME:SECURITY_HASH") 上完成的。 这是典型的宁静方法吗?
我无法区分用户角色,因为管理员和用户存储在不同的表中。 因此,如果 uri 指示用户角色,这将使事情变得更容易。 我不想总是在用户之前查询管理表。
我会做以下事情:
1) 有像 POST /admin/user/1000/redeem/approve 这样的 URL
原因:
我不想公开有关必须更改用户记录中的哪个字段才能批准凭证的知识
我更喜欢将所有管理操作与普通用户操作分开
2)“通常”的方法之一是在成功登录后发布(定期更新)会话cookie(与用户名或密码哈希无关),然后单独使用一种机制将此cookie与用户名相关联并检查是否这个用户名允许给定的操作。
原因:您降低了暴露用户信息的危险。 (如果攻击者窃取了 cookie,这种方法可能仍然容易受到攻击,但另一种方法也是如此)。
3) 如果我们谈论安全性,您将管理员和用户数据存储在不同的表中不是借口:) 使用上述 cookie 机制可能会有所帮助,但您仍然必须建立验证给定用户可以的方式调用给定的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.