drf 认证 频率和权限
内容详细
1 认证
# 登陆接口---》登陆成功,只要给前端返回json格式字符串---》字符串中带一个随机字符串
# 认证---》登陆认证---》判断用户是否登录了---》前后端分离---》用不到cookie---》携带随机字符串过来---》通过判断随机字符串判断这个人是否登录了
# 登陆接口编写步骤
-创建表:User表,一对一UserToken表
-前端传入用户名,密码---》User表中查,如果能查到---》让他登陆成功---》在UserToken中存一条记录---》返回给前端json
格式字符串---》字符串中带一个随机字符串
1.1 登陆接口
# class UserView(ViewSetMixin,APIView):
class UserView(ViewSet):
@action(methods=['POST'], detail=False)
def login(self, request):
username = request.data.get('username')
password = request.data.get('password')
user = User.objects.filter(username=username, password=password).first()
if user:
# 登陆成功--》生成一个随机字符串-->存到token表中(如果之前有记录,更新,如果没有新增)
# uuid生成不重复的串---》理论上不重复
token = str(uuid.uuid4()) # 伪随机数生成,没有参数,重复概率,比其他的高一些
UserToken.objects.update_or_create(user=user, defaults={'token': token}) # 如果存在就更新,如果不存在就新增
return Response({'code': 100, 'msg': '登陆成功', 'token': token})
else:
return Response({'code': 101, 'msg': '用户名或密码错误'})
urls.py
from app01 import views
from rest_framework.routers import SimpleRouter
router=SimpleRouter()
router.register('user',views.UserView,'user')
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(router.urls)),
]
models.py
class User(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
user_type = models.IntegerField(choices=((1, '超级管理员'), (2, '普通管理员'), (3, '普通用户')))
# gender=models.IntegerField(choices=((1,"男"),(2,"女"),(0,"未知"))) # 1:男 2:女 0:未知
# user对象.get_字段名_display() 快速取出gender数字对应的中文
class UserToken(models.Model):
user = models.OneToOneField(to=User,on_delete=models.CASCADE)
token = models.CharField(max_length=32)
1.2 认证类
# 认证类:用来校验用户是否登录,如果登录了,继续往下走,如果没有登录,直接返回
# 编写步骤:
-第一步:写一个类,继承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串
2 频率
# 认证,权限都通过以后,现在某个接口的访问频率---》一般根据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'
),
3 权限
# 登录成功----》所有必须登录能访问---》每个视图类上加认证类
# 用户是普通用户---》普通用户可以访问所有和单条
# 普通管理员和超级用户可以操作所有,除了访问单条和所有的那个视图类,加上认证类
# 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",]
}
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
__EOF__

本文作者:向上
本文链接:https://www.cnblogs.com/ydy001/p/16299271.html
关于博主:没有收拾残局的能力,就别放纵善变的情绪
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/ydy001/p/16299271.html
关于博主:没有收拾残局的能力,就别放纵善变的情绪
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)