API设计:如何处理涉及用户权限/角色管理的以下案例

时间:2012-05-28 18:36:43

标签: api design-patterns

我正在设计一个Web API,它处于最基本的阶段。

我系统中的每个用户都可以拥有一个或多个角色。 (示例用户和管理员)。

API本身被设计为模块和方法,例如我有一个模块User,其下面有以下方法

用户

  • get_friends_of
  • get_profile_pic_url

现在,在我的用户角色管理代码中,每个方法都是“正确的”。这些权限分配给一个或多个角色,例如两个角色看起来像

user_role = ['get_profile_pic_url'] administrator_role = ['get_profile_pic_url','get_friends_of']

因此,每当用户尝试调用某个方法时,我都会看到任何他的角色是否将此方法视为正确。如果是,则调用它,否则不是。

除了下列情况外,这就像黄油一样。

用户X一般没有权利调用'get_friends_of',但我想让他在试图获取自己的朋友时调用该方法。

例如,允许使用get_friends_of(X)但拒绝get_friends_of(y)。

我的问题是如何将这些案例纳入我的设计中?

一个直接的解决方案可能是我引入了“get_my_friends”方法,但随后它增加了我的API的大小,我必须编写更多文档并去看它实际上只是“get_friends_of”的一个特例。此外,它在某种意义上是不可扩展的,我可能希望允许用户看到朋友的朋友。

我的API中的一个设计目标是每个方法调用您是互斥的。

2 个答案:

答案 0 :(得分:1)

你的授权方式......你有      - 用户 - >角色      - 角色 - >权利(职能名称)

如果你实施了你想做的事情......你会做到的:      - 角色 - >权限(功能名称+特定参数值)。

这感觉不对。您可以拥有基于函数名和参数值的权限,但是您的整个授权逻辑将具有太多逻辑......维护将变得非常复杂。

我建议你做你说的....创建一个新函数get_my_friends()

答案 1 :(得分:0)

在我看来,您的User模块以两种不同的方式使用 - 代表单个User实体(get_my_friendsget_profile_pic_url个案例)并提供一般用户相关的访问(get_friends_of案例)。您可能需要考虑将这些分隔为UserUserRepository,其中前者代表拥有朋友和个人资料图片网址的真实世界User,后者提供通用访问User s。

以下是一些链接,解释了您遇到的概念的更多信息: