【发布时间】:2015-11-10 19:48:48
【问题描述】:
我正在设计 DRF 应用程序的授权。我需要使用角色,而不仅仅是权限。
我有一个模型(例如project),其中有一些可以被某些角色(例如admin)修改的信息(例如名称、描述)。但同时还有其他角色(例如worker)不应该能够在该模型中修改该信息,但仍可以修改一些其他信息(例如初始日期和最终日期)。
我为这个问题想到了两种解决方案。第一个是读取发送的 HTTP 请求并根据请求的内容定义要采取的操作。这意味着每次向模型中添加一个新字段时,我都必须修改这个逻辑。这听起来很难维护,容易出错并且可能引入漏洞。
另一方面,我认为我可以将模型分成两个不同的模型。其中一个包含只有一个角色 (admin) 可以修改的数据,另一个定义可以由两个角色修改的其他数据 (admin, worker)。这样,我就不必解析 HTTP 请求,因为如果我收到影响第一个模型的 POST/PUT 请求并且用户具有工作角色,我可以直接拒绝它。
这种情况发生在不止一个模型上。
我想知道是否有默认方式,或者我是否正在重新发明轮子。我想这种情况一定很普遍。例如,我可以想到一个 git 项目,其中一些用户有权在项目内做一件事,而其他用户则不能。
补充说明(非常感谢您的反馈):
我很可能会使用django-role-permissions 模块来实现角色和权限。我不能使用 django 内置组,因为尽管您可以向它们添加权限,但我将使用它们对用户进行分组(与角色无关)。
我将在权限文件中创建角色和权限(基于字符串的权限,例如
create_project、modify_project_description)之间的关系。当收到每个请求时,我将检查哪些角色有权执行该操作并检查用户是否是这些角色中的任何一个(基于活动的授权,这意味着在端点中我将检查活动/操作而不是角色)。
【问题讨论】:
标签: django authorization django-rest-framework roles