我有我的旧数据库。我使用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"),
)
现在,我可以在其中添加下一步以添加基于角色的权限。
答案 0 :(得分:0)
这来自Django文档。
Django的权限框架为对象权限奠定了基础, 尽管核心没有实现。那意味着 检查对象权限将始终返回False或为空 列表(取决于执行的检查)。身份验证后端 将为每个对象接收关键字参数obj和user_obj 相关授权方法并可以返回对象级别 许可。
如上所述:身份验证后端将接收关键字参数 obj
和 user_obj
。。 >
这些拖曳变量是对象级别权限的种子,但是默认后端django.contrib.auth.backends.ModelBackend
并未利用这一点。因此,您应该创建一个自定义后端。
注意:
如果您使用自定义
User
模型your user model should subclassPermissionsMixin
,因为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(添加,更改和删除)
我希望这会推动您前进。