10

我在我的模型中添加了 Meta 类并同步了数据库,然后在 shell 中创建了一个对象,它返回 false 所以我真的不明白错误在哪里,或者缺少什么,是否有某种配置可能在其他一些文件中..

class Employer(User): # Employer inherits from User
    employer_verified = models.BooleanField(default=False)

    class Meta:
        permissions = (
            ("is_member", "Friendly permission description"),
        )

emp = Employer.objects.create(blablabla)
emp.save()
emp.has_perm('myappname.is_member')
4

1 回答 1

20

在您给出的示例中,我希望emp.has_perm('myappname.is_member')确实是False. 除非您明确授予新Employer对象is_member权限,否则它不会拥有它。

要以编程方式授予它您需要获取实际权限对象并将其添加到Employer's 的权限user_permissions

from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType

content_type = ContentType.objects.get_for_model(Employer)
permission = Permission.objects.get(content_type=content_type, codename='is_member')

emp = Employer.objects.create(blablabla)
emp.save()
emp.user_permissions.add(permission)

要在 shell 中测试它,您可能需要删除为每个用户创建的权限缓存 - 否则has_perm可能无法反映实际权限:

delattr(emp, '_perm_cache')

回答您的问题:

如果您希望每个Employer人都获得is_member许可,有几个选项:

  1. 覆盖检查是否没有的save方法(这意味着它是一个新对象,并在保存后创建我上面显示的权限。不是很漂亮,但它会工作。Employerself.pk

  2. 编写您自己的身份验证后端。如果权限码是'is_member'并且UserEmployer实例,返回True

  3. 不要使用权限。权限系统旨在让您能够动态授予和撤销权限。如果您只关心 a 是否UserEmployer- 然后测试它。不要通过使用权限使其复杂化。

于 2012-04-20T19:47:31.570 回答