认证权限组件
一 认证权限组件
具体啥意思呢?
请求来的时候,先走了三大组件认证、权限、频率组件。我们可以插拔认证类或权限类,来对用户的请求加以限制。
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',
],
}