2014-12-26 225 views
0

面向管理员和非管理员帐户设计api的问题。我遵循MVC模式,其中控制器将映射到一个uri。管理员和非管理员帐户的Restful api设计

化妆场景:
让我说有一个系统,允许用户在花钱购买商品并收集积分后兑换礼物。

我的系统有一个用户配置文件,礼物和兑换表。 每个用户都可以兑换很多礼物,每个礼物都可以被很多用户兑换。 (兑换是交接表)。

要访问用户简档,则URI将是这样的:
GET /用户/ 0001

要兑换礼品
POST /用户/ 0001 /赎回{ “量”:1, “地址” :“旧地址”}

一切看起来不错,整齐到这一点。现在的问题出现时的赎回需要由管理员用户

所以被批准更新赎回已批准状态
PUT /用户/ 0001 /赎回/ 100 {“地位”:“批准”}

用户可以更新送货地址,其中礼物将要运到
PUT /用户/ 0001 /赎回/ 100 {“地址”:“新地址”}

现在我面临着以下问题:
1)如果2路径指向uri,控制器将有2个不同的处理代码在同一个函数中.1如果阻塞为admin,则为1则阻塞用户。

如果我在uri前面添加一个管理员(admin/user/0001/redeem/100)。 2个不同的路径将识别相同的资源。

2)在授权标头(Authorization =“USERNAME:SECURITY_HASH”)上标识用户身份。这是一种典型的宁静方式吗?

3)我无法区分用户角色,因为管理员和用户存储在不同的表中。所以如果uri表明用户角色,这将使事情变得更容易。我不希望在用户之前总是查询管理表。

回答

0

我会做到以下几点:

1)具有URL比如POST /管理/用户/ 1000 /赎回/批准

原因:

  • 我不希望暴露关于用户记录中的哪个字段必须被更改以批准优惠券的知识

  • 我更愿意将所有管理员操作与正常用户操作分开

2)其中的“平常”的方法是有一个(定期更新)会话cookie(不涉及用户名或密码散列)被成功登录后发出的,然后分别将联想这样的机制cookie和用户名,并检查是否允许此用户名给定操作。

原因:您减少了暴露用户信息的危险。 (如果攻击者窃取cookie,这种方法可能仍然很脆弱,但另一方案也是如此)。

3)如果我们谈论安全性,那么您将管理员和用户数据存储在不同的表中并不是理由:)使用上述cookie机制可能会有所帮助,但您仍然必须建立验证方式给定的用户可以调用给定的方法。

+0

感谢您的迅速回复。对无状态的压力意味着会话cookie将违反约束条件。 Restful也不建议将动词用于动作。批准可以用幂等投入法替代。 – user3766391