认证
py文件编写
# 步骤:写一个类,继承BaseAuthentication,重写authenticate,在方法中做校验,校验是否登录,返回两个值,没有登录抛异常
class LoginAuth(BaseAuthentication):
def authenticate(self, request):
# 前端带过来的token,放在哪,是接口(我们)固定的
token = request.query_params.get('token')
user_token = UserToken.objects.filter(token=token).first()
if user_token: # 登录了
# 第一个:当前登录用户,第二个:token返回
return user_token.user, token
else:
# 抛出认证失败的异常
raise AuthenticationFailed('您没有登录')
views中使用
# 认证类:用来校验用户是否登录,如果登录了,继续往下走,如果没有登录,直接返回
# 编写步骤:
-第一步:写一个类,继承BaseAuthentication,重写authenticate,在方法中做校验,校验是否登录,返回两个值,没有登录抛异常
-第二步:全局配置,局部配置
-全局配置:配置文件中
REST_FRAMEWORK={
"DEFAULT_AUTHENTICATION_CLASSES":["app01.auth.LoginAuth",]
}
-局部配置:在视图类中
class UserView(ViewSet):
authentication_classes = [LoginAuth]
-局部禁用:
class UserView(ViewSet):
authentication_classes = []
# 认证类中返回的两个变量,干啥用了
-返回的第一个,给了request.user,就是当前登录用户
-返回的第二个,给了request.auth,就是token串
频率
py文件中书写
# 频率限制类,继承SimpleRateThrottle类,里面给我们封装好了
from rest_framework.throttling import BaseThrottle,SimpleRateThrottle
class IPThrottle(SimpleRateThrottle):
scope = 'minute_3' # 随便写
# 返回什么,就以什么做现在
def get_cache_key(self, request, view):
# 限制ip地址---》request.META字典---》请求头中数据
return request.META.get('REMOTE_ADDR') # 客户端ip
# return request.user.id # 用户id限制
class UserThrottle(SimpleRateThrottle):
scope = 'minute_5' # 随便写
# 返回什么,就以什么做现在
def get_cache_key(self, request, view):
return request.user.id
views中使用
# 认证,权限都通过以后,现在某个接口的访问频率---》一般根据ip或者用户限制
# 使用步骤
-第一步:写一个类,继承SimpleRateThrottle,重写类属性:scope,和get_cache_key方法
get_cache_key返回什么,就以什么做现在,scope配置文件中要用
-第二步:在配置文件中配置
'DEFAULT_THROTTLE_RATES': {
'minute_3': '3/m' # minute_3是scope的字符串,一分钟访问3次
'minute_5':'5/m'
}
-局部使用--》视图类中
class BookView(GenericViewSet, ListModelMixin, RetrieveModelMixin):
throttle_classes = [IPThrottle]
-全局使用--配置文件中
'DEFAULT_THROTTLE_CLASSES': ( # 全局配置频率类
'app01.auth.IPThrottle'
),
权限
py文件中编写
# 权限类
from rest_framework.permissions import BasePermission
class UserPermission(BasePermission):
def has_permission(self, request, view):
self.message='您是:%s,没有权限'%request.user.get_user_type_display() # 没有权限的提示信息
# 如果有权限,返回True,没有权限返回False
# 权限类,在认证类之后,request.user有了当前登录用户
user_type = request.user.user_type
if user_type < 3: # 只要不是1,2,就没有权限
return True
else:
return False
views中使用
# 登录成功----》所有必须登录能访问---》每个视图类上加认证类
# 用户是普通用户---》普通用户可以访问所有和单条
# 普通管理员和超级用户可以操作所有,除了访问单条和所有的那个视图类,加上认证类
# books:查看一条,和所有
# booksdetail路由下有:删除,新增,修改---》权限类加在这里
# book 5个接口,必须登录才能访问
# 5个接口分成了俩视图写:
-BookView:获取所有,获取单条
-BookDetailView:删除,修改,新增
-这俩视图都需要登录:authentication_classes = [LoginAuth, ]
-BookView只要登陆就可以操作
-BookDetailView必须有权限才能,加了一个权限,permission_classes = [UserPermission, ]
# 跟写认证类步骤差不多
第一步:写一个类,继承BasePermission,重写has_permission,判断如果有权限,返回True,如果没有权限,返回False
第二步:局部使用和全局使用
-局部使用
class BookDetailView(GenericViewSet, CreateModelMixin, DestroyModelMixin, UpdateModelMixin):
permission_classes = [UserPermission, ]
-全使用
REST_FRAMEWORK={
"DEFAULT_PERMISSION_CLASSES":["app01.auth.UserPermission",]
}
views中使用三大认证例子
# 普通用户,只能查看
from .auth import IPThrottle
class BookView(GenericViewSet, ListModelMixin, RetrieveModelMixin):
authentication_classes = [LoginAuth,]
throttle_classes = [IPThrottle]
queryset = Book.objects.all()
serializer_class = BookSerializer
# 普通用户以上,才能修改。。。
from .auth import UserPermission
class BookDetailView(GenericViewSet, CreateModelMixin, DestroyModelMixin, UpdateModelMixin):
authentication_classes = [LoginAuth, ]
permission_classes = [UserPermission, ]
queryset = Book.objects.all()
serializer_class = BookSerializer