[英]Implement roles in django rest framework
我正在構建一個應具有以下類型用戶的 API
super_user
- 創建/管理管理員
admin
- 管理事件(模型)和事件參與者
participants
- 參加活動,受管理員邀請參加活動
另外我想讓每種類型的用戶都有電話號碼字段
我試過了
class SuperUser(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
phone_number = models.CharField(max_length=20)
class Admin(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
phone_number = models.CharField(max_length=20)
class Participant(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
phone_number = models.CharField(max_length=20)
但是直覺告訴我這是一種錯誤的處理方式。 有人可以幫忙嗎。
一種可能的解決方案是:
解釋:
僅使用一個用戶模型是一種更簡單靈活的解決方案。 您可以查詢所有用戶,或按功能(如用戶角色)過濾。 標准 Django 身份驗證系統需要一個 UserModel。
閱讀有關 Django 用戶組的更多信息。 請參閱“ Django 權限文檔#1 ”和“ Django 組文檔#2 ”。 同樣有用的是“ 用戶組和權限”。
您需要為每個用戶角色創建一個組,並為每個組添加所需的權限。 (Django 有一個默認的模型權限,自動創建,查看給定鏈接上的文檔)或在模型定義中手動創建所需的權限。
手動或使用腳本,通過在創建用戶時定義他的角色或通過 Django 管理界面手動將用戶添加到所需的組。
現在一切都應該准備就緒,可以通過用戶角色進行有限訪問。 您可以使用權限類輕松限制對 DRF 視圖的訪問。 在“ DRF 權限文檔”中查看更多信息。
讓我們定義我們自己的:
from rest_framework.permissions import DjangoModelPermissions
# Using DjangoModelPermissions we can limit access by checking user permissions.
# Rights need only for CreateUpdateDelete actions.
class CUDModelPermissions(DjangoModelPermissions):
perms_map = {
'GET': [],
'OPTIONS': [],
'HEAD': ['%(app_label)s.read_%(model_name)s'],
'POST': ['%(app_label)s.add_%(model_name)s'],
'PUT': ['%(app_label)s.change_%(model_name)s'],
'PATCH': ['%(app_label)s.change_%(model_name)s'],
'DELETE': ['%(app_label)s.delete_%(model_name)s'],
}
# Or you can inherit from BasePermission class and define your own rule for access
from rest_framework.permissions import BasePermission
class AdminsPermissions(BasePermission):
allowed_user_roles = (User.SUPERVISOR, User.ADMINISTRATOR)
def has_permission(self, request, view):
is_allowed_user = request.user.role in self.allowed_user_roles
return is_allowed_user
# ----
# on views.py
from rest_framework import generics
from .mypermissions import CUDModelPermissions, AdminsPermissions
class MyViewWithPermissions(generics.RetrieveUpdateDestroyAPIView):
permission_classes = [CUDModelPermissions, ]
queryset = SomeModel.objects.all()
serializer_class = MyModelSerializer
您可以添加額外的權限類來組合訪問限制。
所以在 Django 中,任何用戶都有一個標志is_superuser
對應於你的“超級用戶”。 所以只需使用它 - 例如User.objects.create(is_superuser=True)
。
對於其余部分,您可以簡單地使用普通用戶模型的字段來區分普通用戶的子角色。
class User(AbstractBaseUser):
can_participate_event = models.Boolean(default=False)
can_create_event = models.Boolean(default=False)
或者
class User(AbstractBaseUser):
permissions = models.CharField(default='') # and populate with e.g. 'create_event,participate_event'
您仍然可能需要檢查視圖中的所有這些字段。 你添加到你的應用程序中越多,它就會變得越多,所以我建議使用像rest-framework-roles (我是作者)或監護人這樣的 3rd 方庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.