欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

django-rest-framework教程--认证和权限

程序员文章站 2022-03-27 14:05:15
1. 认证和权限的区别:(1)认证指的是对用户登录的身份进行校验(2)权限指的是一个登录验证通过的用户可以访问哪些接口,或者是对某一个接口可以拿到什么级别权限的数据2. token认证,创建方式有两种(1)使用django manage.py生成token, 前提一定要将token注册到应用中INSTALLED_APPS = [ "rest_framework.authtoken", # DRF自带的Token认证,会生成一张数据表]python manage.py d...

1. 认证和权限的区别:

(1)认证指的是对用户登录的身份进行校验

(2)权限指的是一个登录验证通过的用户可以访问哪些接口,或者是对某一个接口可以拿到什么级别权限的数据

2. token认证,创建方式有两种

(1)使用django manage.py生成token, 前提一定要将token注册到应用中

INSTALLED_APPS = [
    "rest_framework.authtoken",  # DRF自带的Token认证,会生成一张数据表
]

python manage.py drf_create_token admin

(2)通过django的信号机制自动生成token,views.py中创建生成token的函数

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from django.conf import settings
from rest_framework.authtoken.models import Token


@receiver(post_save, sender=settings.AUTH_USER_MODEL)  # django的信号机制
def generate_token(sender, instance=None, created=False, **kwargs):
    """
    创建用户时自动生成token
    :param sender:
    :param instance:
    :param created:
    :param kwargs:
    :return:
    """
    if created:
        Token.objects.create(user=instance)

(3)django-rest-framework已经帮我们实现了用户拿到自己token的接口函数,我们只需要在跟项目的urls.py文件中增加路由配置即可

from rest_framework.authtoken import views

urlpatterns = [
    path("api_auth_token/", views.obtain_auth_token),  # 获取token的接口
    path('admin/', admin.site.urls),
]

3. 不同的接口使用不同的认证方式

(1)函数式编程实现,注意:认证装饰器要放在api_view装饰器的下方

from rest_framework.decorators import api_view
from rest_framework.decorators import authentication_classes
from rest_framework.authentication import BasicAuthentication, SessionAuthentication, TokenAuthentication


# 一、函数式编程 Function Based View
@api_view(["GET", "POST"])
@authentication_classes((BasicAuthentication, ))
def course_list(request):
    """
    获取所有课程信息或新增一个课程
    :param request:
    :return:
    """
    pass

由此得出结论:接口上的认证设置高于全局的认证设置 

(2)类视图、通用类视图、DRF的视图集如何单独设置认证方式, 只需要在类里面增加一个类属性即可实现:

from rest_framework.views import APIView
from rest_framework.authentication import BasicAuthentication, SessionAuthentication, TokenAuthentication


class CourseList(APIView):

    authentication_classes = [TokenAuthentication, BasicAuthentication]

4. 权限的设置

(1)常用的权限类,设置权限策略

设置单个函数视图的权限接口类

from rest_framework.decorators import permission_classes
from rest_framework.permissions import IsAuthenticated, AllowAny, IsAdminUser, IsAuthenticatedOrReadOnly


# 一、函数式编程 Function Based View
@api_view(["GET", "POST"])
@authentication_classes((BasicAuthentication, TokenAuthentication))
@permission_classes((IsAuthenticated, ))
def course_list(request):
    pass

 设置单个类视图、通用类视图、视图集的权限接口类

# 二、类视图 Class Based View
class CourseList(APIView):

    authentication_classes = [TokenAuthentication, BasicAuthentication]
    permission_classes = [IsAdminUser]

(2)如何自定义对象级别的权限

在应用下面创建一个permissions.py文件,代码如下:

from rest_framework import permissions


class IsOwnerReadOnly(permissions.BasePermission):
    """自定义权限,只允许对象的所有者编辑(修改、删除)"""
    def has_object_permission(self, request, view, obj):
        """
        所有的request请求都有读权限,因此一律允许:GET/HEAD/OPTIONS
        :param request:
        :param view:
        :param obj:
        :return: bool
        """
        if request.method in permissions.SAFE_METHODS:
            return True
        # 表示对象的所有者才有写权限
        return request.user == obj.teacher

类视图中如下:

from .permissions import IsOwnerReadOnly


class GcourseDetail(generics.RetrieveUpdateDestroyAPIView):
    """获取、更新、删除一门课程"""
    queryset = Course.objects.all()
    serializer_class = CourseSerializer

    # 权限
    permission_classes = [IsAuthenticated, IsOwnerReadOnly]

 

本文地址:https://blog.csdn.net/weixin_42289273/article/details/110259503

相关标签: django-rest-framework