【问题标题】:Unable to set custom permissions in Django无法在 Django 中设置自定义权限
【发布时间】:2011-04-02 04:10:49
【问题描述】:

我正在尝试为 Django 应用程序设置一些自定义权限,但似乎无法使其正常工作。官方文档有点少,并且没有提到(至少我能找到)如何实际设置权限?根据我找到的一些 3rd 方教程,我扩展了 User 类,它似乎工作正常:

from django.db import models
from django.contrib.auth.models import User,UserManager

    class CustomUser(User):
        custom_field = models.CharField(max_length=250)
        objects = UserManager()

        class Meta:
            permissions = (
                ('is_custom','Has a Custom Permission'),
            )

但是,当我尝试设置权限时,它不起作用:

>>> from project.custauth.models import CustomUser
>>> from django.contrib.auth.models import User, Permission
>>> user = CustomUser.objects.get(username='new.user')
>>> user
<CustomUser: new.user>
>>> custom_permission = Permission.objects.get(codename="is_custom")
>>> custom_permission
<Permission: custauth | custom user | Has a Custom Permission>
>>> custom_permission.save()
>>> user.user_permissions.add(custom_permission)
>>> user.save()
>>> user.has_perm(custom_permission)
False
>>> user.get_all_permissions()
set([])

关于我做错了什么有什么想法吗?我将 Django 1.2.1 与 Python 2.4.3 一起使用。感谢所有输入...

【问题讨论】:

标签: python django permissions


【解决方案1】:

我测试了您的代码(Python 2.6.2、Django 1.2.1),一切正常。你能写一个单元测试来执行相同的代码sn-p吗?

附带说明user.has_perm(custom_permission) 不会返回True。试试user.has_perm('app.is_custom')

更新

代码 sn-p 如下:

In [1]: from app.models import CustomUser

In [2]: from django.contrib.auth.models import User, Permission

In [3]: user = CustomUser.objects.get(username = 'new.user')

In [4]: custom_permission = Permission.objects.get(codename='is_custom')

In [5]: user.user_permissions.add(custom_permission)

In [6]: user.save()

In [7]: user.has_perm(custom_permission)
Out[7]: False

In [8]: user.has_perm('app.is_custom')
Out[8]: True

In [9]: user.get_all_permissions()
Out[9]: set([u'app.is_custom'])

【讨论】:

  • 我一定会记住提示:has_perm()。谢谢。我还没有使用 Django 的测试功能(这是一个相当简单的应用程序,所以我只是边做边测试)。与仅使用 manage.py shell 相比,这样做有什么好处吗?无论如何,问题在于 user.get_all_permissions() 返回一个空集。我注意到您正在运行更新版本的 Python,所以我再次尝试使用 2.6.5,但仍然看到相同的行为。你得到一个空集吗?如果没有,您介意粘贴您使用的代码,以便我查看是否有任何差异?谢谢。
  • (1) 我更喜欢编写单元测试有两个原因:没有挥之不去的数据库副作用,因为每次都会关闭测试数据库;对以后防止回归有用(2)我没有得到一个空集。我将更新我的答案以发布我使用的代码。
【解决方案2】:

我在不同的平台上进行了更多测试,并且能够复制您的结果。经过更多挖掘后,我发现这是身份验证后端的问题,而不是权限本身的问题。

感谢您的帮助 Manoj。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多