在 Django 中为特定视图设置用户权限

Posted

技术标签:

【中文标题】在 Django 中为特定视图设置用户权限【英文标题】:Set user permissions for specific views in Django 【发布时间】:2016-01-10 06:22:51 【问题描述】:

我正在使用 Django 创建一个包含许多不同页面的网站。我只有视图,我没有在我的项目中定义任何模型。我希望某些用户具有受限访问权限(他们只能看到我创建的一些视图)。我在 Django 管理站点中设置了一些用户,并使用 Python @login_required 装饰器向我的网站添加了登录功能。

不过,我对如何为每个用户设置查看权限有点迷茫。我查看了 @permission_required 装饰器,但它似乎只与模型有关,与视图无关。 Django中如何设置页面查看权限?

【问题讨论】:

【参考方案1】:

权限与模型相关联。如果您的授权逻辑链接到视图而不是模型,请考虑创建一个组并使用 user_passes_test 装饰器。例如,假设您有一个只有主管才能看到的报告:创建一个名为 Supervisors 的组并测试成员资格:

def must_be_supervisor(user):
    return user.groups.filter(name='Supervisors').count()

@user_passes_test(must_be_supervisor)
def quarter_report(request):
    ...

【讨论】:

【参考方案2】:

您应该对视图使用 user_passes_test 装饰器。 Django 文档有一个很好的例子来说明它的用法 https://docs.djangoproject.com/en/1.8/topics/auth/default/#django.contrib.auth.decorators.user_passes_test

已编辑:实际上您也可以对视图使用 permission_required 装饰器 https://docs.djangoproject.com/en/1.8/topics/auth/default/#django.contrib.auth.decorators.permission_required

【讨论】:

user_passes_test 装饰器看起来很完美。您知道是否可以在组和个人用户上使用它? @kdubs 是的,当然可以。这里有一个很好的例子bradmontgomery.net/blog/restricting-access-by-group-in-django我在我的一个项目中使用过它,它就像一个魅力。【参考方案3】:

看看django-braces。正是为此目的,它是一款出色的应用程序; https://django-braces.readthedocs.org/en/latest/index.html

它为几乎所有可能的情况提供了一个混合用于视图和表单,允许您执行检查以限制您认为合适的访问。

【讨论】:

【参考方案4】:

你可以在url中使用permission_required来锁定

示例:https://docs.djangoproject.com/en/3.2/topics/class-based-views/intro/#decorating-in-urlconf

【讨论】:

链接到外部资源是可以的,但它们将来可能会中断,那么你的答案将毫无用处。如果您只是将答案中的相关部分(可能是带有示例用法的代码 sn-p)与链接一起复制,这将有所帮助。

以上是关于在 Django 中为特定视图设置用户权限的主要内容,如果未能解决你的问题,请参考以下文章

django - 使用 get_or_create 自动创建用户时设置用户权限

如何在Django中获取具有特定权限组的所有用户的列表

C# - 在 Windows 7 中为所有用户设置目录权限

如何在 Django 中为特定用户和特定项目使用 deleteview?

Django权限

如何在oracle中为特定用户查询没有所有者名称的表名