zoukankan      html  css  js  c++  java
  • 基于 `Django` 自带的权限系统认证

    基于 Django 自带的权限系统认证

    • 创建用户 create_user 方法

      from rest_framework.views import APIView
      from rest_framework.response import Response
      
      class UserRegisterView(APIView):
          '''注册用户'''
          def post(request, *args, **kwargs):
              # 添加用户入库
              user_obj = User.objects.create_user(**request.data)
              # 判断是否添加成功
              if not user_obj:
                 return Response({"code":0, "msg":"failure" ,"data":{}}, 200)
              return Response({"code":1,"msg":"success","data":{}}, 200)
      
    • 根据用户名和密码登录

      from rest_framework.views import APIView
      from rest_framework.response import Response
      from django.contrib import auth
      
      class UserLoginView(APIView):
          ''' 用户登录 '''
      
          def post(self, request, *args, **kwargs):
              # 验证用户权限
              auth_obj = auth.authenticate(request, **request.data)
              # 如果有权限则直接登录,并将信息写入session和request.user中
              if auth_obj:
                  # 将用户数据写入request.user中和session中
                  auth.login(request, auth_obj)
                  # 填充载荷
                  payload = {
                      "uid": request.user.id
                  }
                  # 生成 token
                  token = jwt_encode(payload)
                  # 返回数据
                  return Response({"code":1,"msg":"登录成功","data":{"token": token}}, 200)
              # 返回登陆失败数据
              return Response({"code":0, "msg":"用户名或者密码错误" ,"data":{}}, 200)
      
    • 注销登录

      from rest_framework.views import APIView
      from rest_framework.response import Response
      from django.contrib import auth
      
      class UserLogoutView(APIView):
          '''用户注销登录'''
          def post(request, *args, **kwargs):
              auth.logout(request)
              return Response({"code": 1,"msg": "用户登出成功", "data":{}}, 200)
      
    • jwt 编码和解码

      '''
      	安装 pyjwt:  pip install pyjwt
      '''
      
      import jwt, time
      
      SECRET_KEY = "e=-4xbvcg!%0*!d1+a$s(8zb_zljav8gd(mj_v2)@&@!ktpr5("
      
      
      def jwt_encode(raw, expir=7200):
          '''jwt编码'''
          raw['exp'] = int(time.time()) + expir
          return jwt.encode(raw, SECRET_KEY, algorithm="HS256").decode()
      
      
      def jwt_decode(raw):
          '''jwt解码'''
          try:
              return jwt.decode(raw, SECRET_KEY, algorithms=["HS256"])
          except:
              return {}
      
    • 新建中间件

      from django.utils.deprecation import MiddlewareMixin
      from django.http import JsonResponse
      
      class UserCheckAuthMiddleware(MiddlewareMixin):
          '''检查用户登录'''
          
          def process_request(request, *args, **kwargs):
              # 判断请求地址是否在白名单中
              if request.path not in ["login/", "logout/", "register/"]:
                  token = request.headers.get("token", "")
                  if not token:
                      return JsonResponse({"code": -1, "msg": "缺省token", "data":{}}, 200)
                  if not jwt_decode(token):
                      return JsonResponse({"code": -1, "msg": "token已过期", "data":{}}, 200)
                  if not request.user.is_active:
                      return JsonResponse({"code": -1, "msg": "用户权限受限,请联系管理员", "data":{}}, 200)
      			return None
              
              
      class ExceptionMiddleware(MiddlewareMixin):
      	'''异常捕获'''
          
          def process_exception(self, request, exception):
              return JsonResponse({
                  "code": -1,
                  "msg": "服务不可用",
                  "detail": str(exception),
                  "data": {}
              })
      
    • 常用的方法

      方法名 备注
      create_user 创建用户
      authenticate 登录验证
      login 记录登录状态
      logout 退出用户登录
      is_authenticated 判断用户是否登录
      login_required装饰器 进行登录判断
  • 相关阅读:
    javascript中的常用表单事件用法
    关于js键盘事件的例子
    对象间引用赋值及方法时引用传递
    反编译工具reflector破解方法
    使用委托(C# 编程指南)
    委托(C# 编程指南)
    浅谈线程池(下):相关试验及注意事项
    Lambda 表达式(C# 编程指南)
    浅谈线程池(中):独立线程池的作用及IO线程池
    浅谈线程池(上):线程池的作用及CLR线程池
  • 原文地址:https://www.cnblogs.com/wuxiaoshi/p/14868864.html
Copyright © 2011-2022 走看看