这是一个棘手的问题,我们已经讨论了一段时间(几天),但还没有找到令人信服的好解决方案。这是这种情况:
- 我们有用户和组。一个用户可以属于多个组(多对多关系)
- 网站的某些部分需要访问控制,但是:
- 某些表的某些 ROWS 需要访问控制,即。某个用户(或某个组)不应该能够删除某行,但同一表的其他行可能对该用户(或组)具有不同的权限设置
有没有简单的方法来完成这个?我们错过了什么吗?
我们需要在 python 中实现它(如果有帮助的话)。
这是一个棘手的问题,我们已经讨论了一段时间(几天),但还没有找到令人信服的好解决方案。这是这种情况:
有没有简单的方法来完成这个?我们错过了什么吗?
我们需要在 python 中实现它(如果有帮助的话)。
这个问题并不新鲜。它基本上是授权和访问权限/控制的一般问题。
为了避免必须建模和维护每个用户可以以每种可能方式访问的确切对象的完整图表,您必须(基于您的应用程序所做的)决定如何开始控制乘法比例因子。那么首先:用户从哪里获得他们的权利?如果每个用户都被单独分配了权限,那么您将对需要添加用户、修改用户等的任何人构成重大的 ongoig 管理挑战。
也许用户可以从他们所属的组中获得他们的权利。现在,您有了一个可简化管理并使系统更易于理解的比例因子。更改组会更改所有成员用户的有效权限。
现在,这些权利是什么样的?逐个对象地分配目标对象的权限可能仍然不明智。因此,也许权利应该被认为是一组抽象的“访问卡”。系统中的对象可以被标记为需要“蓝色”访问以进行读取、“红色”访问以进行更新以及“黑色”访问以进行删除。这些抽象权利可能以某种拓扑排列,例如拥有“黑色”访问权限意味着您隐含地也拥有“红色”和“蓝色”,或者它们可能都是不相交的;这取决于您以及您的应用程序必须如何工作。(另请注意,您可能需要考虑对象类型——表,如果你喜欢的话——可能需要它们自己的访问规则,至少对于“创建”而言。
通过在图表中引入收集点,您可以将系统中的参与者与他们所作用的对象相关联,您可以处理规模问题并控制授权的复杂性。然而,这从来都不是一件容易的事,而且通常情况下,表达出客户的愿望会导致一些永远不会成功并且实际上永远不会实现客户(认为她)想要的东西的情况。
实现语言与您需要做出的架构决策没有太大关系。
1)创建具有权限的表,即删除、更新等
2)在权限表上创建一个三向数据透视表,您想要行级访问的任何表以及包含访问权限单元(组或用户)的任何表。
3) 在允许操作继续之前检查数据透视表中的关系。
您的权利表可能如下所示:
ID RIGHT
1 DELETE
2 UPDATE
您想要行级访问控制的表可能如下所示(例如博客):
ID TITLE CONTENT
1 blog entry 1 This is a blog entry
2 blog entry 2 This is another blog entry
你的用户表可能是:
ID NAME
1 Bob
2 Alice
然后数据透视表就像
ID USER_ID RIGHT_ID BLOG_ID
1 1 2 1
2 2 1 1
3 2 2 1
4 2 1 2
5 2 2 2
这意味着 Bob 只能更新博客条目 1,但 Alice 可以更新或删除任一博客条目
编辑:如果您想要来自用户或组的权利,那么每个表都需要两个数据透视表;一个用于用户,一个用于组。在允许或禁止操作之前,您还必须查询数据库以检查用户级别权限和组级别权限
EDIT2:这比大卫的解决方案更复杂,但不需要您提前编写 permission_classes:您可以混合和匹配您想要的任何组级别和用户级别权限,这就是您想要做的。
如果不了解更多关于您的设置以及为什么您需要不同的用户对不同的行拥有不同的权限,很难具体说明。但一般来说,我会说,每当您在代码中访问数据库中的任何数据时,您都应该在它之前进行授权检查,该检查检查当前用户和组以及正在插入/更新/删除/等的行。并决定是否允许该操作。考虑以封装的方式设计您的系统——例如,您可以将所有直接访问数据库的函数放在一个模块中,并确保它们中的每一个都包含正确的授权检查。(将它们全部放在一个文件中可以减少您错过一个文件的可能性)
permission_class
向表中添加一列并让另一个表指定哪些用户或组具有哪些权限类可能会有所帮助。然后您的授权检查只需获取当前行的权限类的值,并查看权限表是否包含该权限类与当前用户或他/她的任何组之间的关联。
将附加列“类别”或“类型”添加到表中,这将对行进行分类(或者,如果您愿意,对它们进行分组/集群) - 然后创建一个数据透视表,定义(rowCategory,userGroup)之间的访问控制)。因此,对于每一行,您可以按其类别提取哪些用户组有权访问(以及何种访问权限)。