在Django中添加模型级别权限的步骤

时间:2018-07-09 11:04:20

标签: django django-models django-forms

我有我的旧数据库。我使用inspectdb创建了模型。我可以在管理页面中看到我的表。我创建了4个用户,并且希望为每个模型实现基于角色的权限。我仅以示例向您展示我在模型中添加诸如编辑,查看,删除之类的权限的操作。 示例:-

class BusinessIntegrationSourceCategory(models.Model):
    date_added = models.DateTimeField(blank=True, null=True)
    date_modified = models.DateTimeField(blank=True, null=True)
    source_category = models.CharField(max_length=255, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'business_integration_source_category'
        permissions = (
            ("view_category", "view category"),
             ("add_category", "Add category"),
            ("delete_category", "Delete category"),
        )

现在,我可以在其中添加下一步以添加基于角色的权限。

1 个答案:

答案 0 :(得分:0)

这来自Django文档。

  

Handling object permissions

     

Django的权限框架为对象权限奠定了基础,   尽管核心没有实现。那意味着   检查对象权限将始终返回False或为空   列表(取决于执行的检查)。身份验证后端   将为每个对象接收关键字参数obj和user_obj   相关授权方法并可以返回对象级别   许可。

如上所述:身份验证后端将接收关键字参数 obj user_obj 。。 >

这些拖曳变量是对象级别权限的种子,但是默认后端django.contrib.auth.backends.ModelBackend并未利用这一点。因此,您应该创建一个自定义后端。

  

注意:

     

如果您使用自定义User模型your user model should subclass PermissionsMixin,因为PermissionsMixin的has_perm方法会将工作传递给已注册的身份验证后端。

尝试:

backends.py文件:

from django.contrib.auth import get_user_model

class MyAuthenticationBackend:

    def authenticate(self, *args, **kwargs):
        pass


    def get_user(self, user_id):
        try:
            return get_user_model().objects.get(pk=user_id)
        except get_user_model().DoesNotExist:
            return None

    def has_perm(self, user_obj, perm, obj=None):
        if perm == "view_category":
            return True # everybody can view
        # otherwise only the owner or the superuser can delete
        return user_obj.is_active and obj.user.pk==user_obj.pk

    def has_perms(self, user_obj, perm_list, obj=None):
        return all(self.has_perm(user_obj, perm, obj) for perm in perm_list)

settings.py文件中添加:

AUTHENTICATION_BACKENDS = [
    'your_app.backends.MyAuthenticationBackend',
    # Your other auth backends, if you were using the default,
    # then comment out the next line, otherwise specify yours
    # 'django.contrib.auth.backends.ModelBackend'
    ]

注意:每个模型已经具有default permissions(添加,更改和删除)

我希望这会推动您前进。