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装饰器 进行登录判断
  • 相关阅读:
    java使用jacob实现word转pdf
    解决 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
    tp框架基本sql语句查询与链式查询
    id和class的区别
    查找算法
    排序算法
    [转]微信小程序开发:从小白开发出通过自拍预测年龄和颜值的小程序
    [转]天天生鲜,html效果布局
    利用乐观锁及redis解决电商秒杀高并发基本逻辑
    Python3.6.0安装
  • 原文地址:https://www.cnblogs.com/wuxiaoshi/p/14868864.html
Copyright © 2011-2022 走看看