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

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]

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专职

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值