簡體   English   中英

在 django rest 框架中實現角色

[英]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)

但是直覺告訴我這是一種錯誤的處理方式。 有人可以幫忙嗎。

一種可能的解決方案是:

    1. 只有一個帶有角色字段的用戶模型,它定義了用戶角色是什么。
    1. 創建一個用戶組並添加每個組所需的權限。
    1. 將用戶添加到用戶組
    1. 使用 Django REST Framework(后來的 DRF)權限類限制訪問。

解釋:

  1. 僅使用一個用戶模型是一種更簡單靈活的解決方案。 您可以查詢所有用戶,或按功能(如用戶角色)過濾。 標准 Django 身份驗證系統需要一個 UserModel。

  2. 閱讀有關 Django 用戶組的更多信息。 請參閱“ Django 權限文檔#1 ”和“ Django 組文檔#2 ”。 同樣有用的是“ 用戶組和權限”。

您需要為每個用戶角色創建一個組,並為每個組添加所需的權限。 (Django 有一個默認的模型權限,自動創建,查看給定鏈接上的文檔)或在模型定義中手動創建所需的權限。

  1. 手動或使用腳本,通過在創建用戶時定義他的角色或通過 Django 管理界面手動將用戶添加到所需的組。

  2. 現在一切都應該准備就緒,可以通過用戶角色進行有限訪問。 您可以使用權限類輕松限制對 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM