1.  
  2. 主页
  3.  / 
  4. DRF实战教程
  5.  / 
  6. DRF实战之认证和权限

DRF实战之认证和权限

认证和权限

现在我们写的接口,会发现一个问题,就是任何人都可以创建数据,都可以修改数据。这样肯定是不行的,我们希望只有数据的创建者才能有权限修改数据。如果不是,只能有读取权限。

模型类

我们设计一个模型类,让这个模型类与用户关联。

from django.db import models


# Create your models here.
class Game(models.Model):
    name = models.CharField(verbose_name='游戏名字', max_length=10)
    desc = models.CharField(verbose_name='描述', max_length=20)
    user = models.ForeignKey('auth.User', on_delete=models.CASCADE)

序列化

from rest_framework import serializers
from .models import Game


class GameSerializer(serializers.ModelSerializer):
    class Meta:
        model = Game
        fields = '__all__'

视图

from .models import Game
from rest_framework import generics
from .serializers import GameSerializer
from rest_framework import permissions
from .permissions import IsOwnerOrReadOnly
from rest_framework.authentication import BasicAuthentication


class GameList(generics.ListCreateAPIView):
    queryset = Game.objects.all()
    serializer_class = GameSerializer

    # 重写 创建的时候提供当前登录的用户
    def perform_create(self, serializer):
        serializer.save(user=self.request.user)


class GameDetail(generics.RetrieveUpdateDestroyAPIView):

    queryset = Game.objects.all()
    serializer_class = GameSerializer

路由

from django.contrib import admin
from django.urls import path, include
from . import views

urlpatterns = [
    path('games/', views.GameList.as_view(), name='game-list'),  # 获取或创建
    path('games/<int:pk>/', views.GameDetail.as_view(), name='game-detail'),  # 查找、更新、删除
]

我们创建两个管理员,分别是xiaoyuan和xiaoyuan1。我们可以用PostMan进行测试。

DRF实战之认证和权限
DRF实战之认证和权限

这以上我们我创建的数据是需要把用户名和密码通过base64加密传递过去进行验证。并且我们通过xiaoyuan这个用户创建的。

权限

刚才我们创建两个用户,现在我通过xiaoyuan1去更新我们xiaoyuan创建的数据,发现是可以更新的,但是这个并不是我们想要的。

创建一个permissions.py,写如下代码:

from rest_framework import permissions


class IsOwnerOrReadOnly(permissions.BasePermission):

    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True

        return obj.user == request.user

上面代码的意思代表判断当前的数据创建用户是否跟当前登录用户是否一个人。并在更新视图上加上该权限

permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                          IsOwnerOrReadOnly,)
DRF实战之认证和权限
DRF实战之认证和权限

我们发现已经没有权限改权限了。

这篇文章对您有用吗?

我们要如何帮助您?

发表评论

您的电子邮箱地址不会被公开。