Django中的读取权限

0 投票
1 回答
726 浏览
提问于 2025-04-18 17:13

我对我的权限选项有点困惑。看起来我可以直接在模型上设置权限,也可以在我的视图中使用permission_required装饰器,还可以在模板中使用{{ perms }}变量。

问题1:这些选项是设计成可以一起使用,相互加强的,还是说它们是独立的选项,甚至可能互相排斥,或者有些冗余,因此不够简洁?

问题2:如果一个用户可以访问模型1,但不能访问模型2,而模型1和模型2之间有外键关系,会发生什么?即使用户没有直接访问模型2,查找操作会自动被阻止(权限拒绝)吗?如果一些内容出现在网站搜索请求中,那又会怎样?

问题3:我很确定我不需要或不想要对象、字段或行级别的权限——除非这是拒绝访问外键的最佳方法?

1 个回答

0

A1: Django 默认有三种权限,分别是“添加”、“修改”和“删除”。在管理后台,每种权限可以让你访问对应的“添加”、“修改”和“删除”表单。所以,这三种权限之间是互不影响的。这就是 Django 核心中实现这三种权限的方式。不过,你可以根据需要添加自己的自定义权限,比如“查看”、“foo”、“可以搜索”等等。权限其实就是一个标记,重要的是你如何实现这些自定义权限的行为。举个例子,你可以测试 user.has_perm(myapp.can_search.MyModel),如果通过了,说明用户可以搜索;如果没有通过,用户就不能搜索。因此,自定义权限的实现方式完全由你决定。

A2: 再次回答这个问题,还是要看具体的实现。

A3: 你为什么想要拒绝对外键的访问呢?你需要定义对模型的访问权限,我觉得这样可以解决你的问题。顺便说一下,对象级别的权限是针对每个对象实例定义的,和外键没有关系。比如说,如果你有200个项目,而你正在处理第10个项目的实例,那么通过对象权限,你可以测试用户是否对这个特定的项目实例有权限。

总之,你可以在这里了解更多关于权限的内容 https://docs.djangoproject.com/en/dev/topics/auth/default/#topic-authorization,还有关于对象权限的内容可以查看 https://pythonhosted.org/django-guardian/。此外,这个网站上还有很多关于 Django 权限的帖子。

撰写回答