认证权限组件

一 认证权限组件

具体啥意思呢?

请求来的时候,先走了三大组件认证、权限、频率组件。我们可以插拔认证类或权限类,来对用户的请求加以限制。

1 认证组件先帮你确定身份,考一个参数request.user来确定,一般就两个身份游客 和 登录用户

2 权限组件根据你的身份帮你确定都能进行什么权限操作,游客来了可以访问什么方法,登录的用户来了可以访问什么方法。

认证

""" 工作原理
这个得自己去做校验  
认证校验方法:
返回None => 游客
返回user,auth => 登录用户
抛出异常 => 非法用户

1)如果前台没有携带认证信息,直接定义为游客
2)如果前台携带了认证信息并认证通过,定位为登录用户,将登录的用户user对象保存在 requset.user 中
3)如果前台携带了认证信息但没有认证通过,一般都定义为游客
	可以自定义为非法用户,抛出 认证失败 异常,但是不建议直接操作,可以交给权限组件根据身份进行权限管理。
	rest_framework.exceptions 的 AuthenticationFailed
"""

权限

""" 工作原理
权限校验方法:
返回False => 没有权限,将信息返回给前台
返回True => 拥有权限,进行下一步认证(频率认证)

## 自带的权限类:
1)AllowAny:允许所有用户,校验方法直接返回True
2)IsAuthenticated:只允许登录用户
	必须request.user和request.user.is_authenticated都通过
3)IsAuthenticatedOrReadOnly:游客只读,登录用户无限制
	get、option、head 请求无限制
	前台请求必须校验 request.user和request.user.is_authenticated
4)IsAdminUser:是否是后台用户
	校验 request.user和request.user.is_staff    is_staff(可以登录后台管理系统的用户)
"""

二 具体代码

局部配置认证以及权限:

ps:(认证这一块一般不用动)

permission_classes = [IsAuthenticatedOrReadOnly] # 局部配置认证类

from rest_framework.generics import RetrieveAPIView
from . import models, serializers
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
# eg:RetrieveUpdateAPIView就可以完成 单取(get),单局部(patch)及整体(put)修改
class UserRetrieveAPIView(RetrieveAPIView):
    # 局部配置
    # 局部取消认证组件:authentication_classes = []
    # 区别启用认证组件:authentication_classes = [认证类们]
    # 局部取消权限组件:permission_classes = []
    # 区别启用权限组件:permission_classes = [权限类们]
    permission_classes = [IsAuthenticated]

    queryset = models.User.objects.filter(is_active=True)
    serializer_class = serializers.UserModelSerializer


from rest_framework.viewsets import ModelViewSet
# 游客只可以查看,登录后可以增删改
from rest_framework.permissions import IsAuthenticatedOrReadOnly
class CarModelViewSet(ModelViewSet):
    queryset = models.Car.objects.filter(is_delete=False) 
    serializer_class = serializers.CarModelSerializer
    permission_classes = [IsAuthenticatedOrReadOnly] # 局部配置认证类	

    def destroy(self, request, *args, **kwargs):
        obj = self.get_object()
        print(obj)
        obj.is_delete = True
        obj.save()
        return Response('删除成功')

全局配置认证以及权限:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        # django默认session校验:校验规则 游客 及 登录用户
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        # 'rest_framework.permissions.AllowAny',
        # 全局配置:一站式网站(所有操作都需要登录后才能访问)
        # 'rest_framework.permissions.IsAuthenticated',
    ],
}
posted @ 2019-11-21 16:28  张明岩  阅读(230)  评论(0编辑  收藏  举报