django-guardian自定义用户权限

时间:2013-12-21 14:17:59

标签: python django django-models user-permissions django-guardian

设置

我刚刚开始与django-guardian合作,并立即遇到了一些障碍。我通过扩展AbstractBaseUser类来使用自定义用户。我按照this示例设置了models.py和admin.py。我还按照developers guide配置指南设置了监护人。


问题

每当我尝试获取与用户相关的权限时,django-guardian就会抛出AttributeError: type object 'MyCustomUser' has no attribute 'groups'错误(MyCustomUser是我的自定义用户类),即当我添加权限时,它会直接进入guardian_userobjectpermission表,就像它应该的那样。但是,对get_perms的调用会抛出上述错误。

尝试通过管理页面编辑权限时出现相同的错误。 (这里没有显示添加的权限。:/)我写了一个小的manage.py任务来测试它:

class Command(BaseCommand):
    def handle(self, *args, **options):
        user1 = MyCustomUser.objects.filter(username='pankaj')[0]
        checker = ObjectPermissionChecker(user1)

        # model on which permissions are applied
        stream = Stream.objects.filter(uuid='001')[0]   

        # works on the database level, doesn't show up on admin page
        assign_perm('read_stream', user1, stream)

        # error
        print 'read_stream' in get_perms(user1, stream)

        # error
        print checker.has_perm('read_stream', stream)

        # error
        print checker.get_perms(stream)

        # works on the database level, doesn't show up on admin page
        remove_perm('read_stream', user, stream)

        # ALWAYS returns True, irrespective of whether permission granted or not
        print user.has_perm('read_stream', stream)

可能的解决方案

  1. 设置身份验证后端可能存在问题。我目前将它设置为:

    AUTHENTICATION_BACKENDS =(

    'django.contrib.auth.backends.ModelBackend',
    
    'guardian.backends.ObjectPermissionBackend',
    

  2. 也许实施自定义用户=>更改/实施自定义组?目前我在admin.py中有admin.site.unregister(Group),但更改它无济于事。

  3. 由于开发者有warned,监护人可能与自定义用户不兼容?

1 个答案:

答案 0 :(得分:0)

根据django-guardian文件here。 Gaurdian在很大程度上依赖于django用户模型的旧时尚。但是,如果扩展AbstractUser模型,或者使用auth.Group定义了ManyToMany关系,您可以通过它来验证模型中的组。

  

django-guardian严重依赖于auth.User模型。具体来说,它是基于auth.Userauth.Group模型的关系构建的。保留这种关系对guardian - 至关重要,没有多少用户(自定义或默认)和auth.Group关系django-guardian将会BREAK。