这个问题(我认为)是关于Django中的对象/行级权限。
我们正在构建社区,需要能够根据用户采取的操作设置权限。例如,在发布了如此多的答案之前,您应该无法启动线程。
此外,用户应该能够删除属于自己的内容。基于Django文档,似乎标准框架不支持实例的权限。
我们应该建立Django提供的“空”API,还是应该使用django-guardian,django-rules等应用程序?在这种情况下你会推荐哪些?
谢谢!
答案 0 :(得分:11)
在你发布了如此多的答案之前,你不应该开始一个线程。
您不需要为此使用每个对象的权限。实际上,您根本不需要使用权限。只需检查用户是否符合您视图中的要求。
或者您可以使用标准的django权限引擎。创建权限,例如"启动线程",然后设置信号以跟踪用户添加答案的时间。当发出信号时,检查用户是否有足够的答案并授予他“开始线程”#34;权限。
由您来决定哪一个更适合您。
此外,用户应该能够删除属于自己的内容。
这可以使用每个对象的权限来完成。但如果它是使用它们的唯一原因,那么我只需在模型中添加一个字段author
,并使用简单的item.author == request.user
检查来测试用户是否可以删除该项目。
所以,我的一般建议是保持简单。分析您的需求。每个对象的权限是一个功能强大的工具,在你的情况下可能有点过分。
答案 1 :(得分:2)
我建议你和Django-guardian一起去。
很棒,DRY,维护且经过良好测试的应用,解决了这个问题。截至今天,这是用于实现每个对象权限的维护最多且actively developed 的库。
我们目前正在其中一个大项目中使用 django-guardian ,并对稳定性和功能感到非常满意。
Django-guardian源代码非常简单易懂,因为它是基于Django核心中的权限代码构建的。
然而,Django permissions for proxy models存在一个小问题,在Django核心中没有修复,因此为它们设置权限(全局和每个对象)非常棘手。解决此问题的方法之一是在每个需要检查访问代理模型的权限时,在非代理对象中声明所有权限并查询它们。
Per-object permission library by OSU Open Source Lab
它更像是一个独立的应用程序,而不是Django-guardian,并支持旧版本的Django。这个应用程序相对维护良好。 (我个人没有用过它。)
<强> Other solutions form older posts 强>
但他们中的大多数人维护得很差。
当然,如果您只需要执行一些次要检查,行级权限就会过度,就像Andrey said一样。