认证和权限
现在我们写的接口,会发现一个问题,就是任何人都可以创建数据,都可以修改数据。这样肯定是不行的,我们希望只有数据的创建者才能有权限修改数据。如果不是,只能有读取权限。
模型类
我们设计一个模型类,让这个模型类与用户关联。
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进行测试。
这以上我们我创建的数据是需要把用户名和密码通过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,)
我们发现已经没有权限改权限了。