zoukankan      html  css  js  c++  java
  • 权限组件

    简单实例

    models.py

    class User(models.Model):
        name = models.CharField(max_length=32)
        pwd = models.CharField(max_length=32)
        user_type = models.IntegerField(choices=((1,"超级管理员"), (2,"会员"), (3,"游客")), default=3)

    permisssion.py

    from rest_framework.permissions import BasePermission
    
    class VIPPermission(BasePermission):
        message = "游客无法查看该部分内容"
    
        def has_permission(self, request, views):
            if request.user.user_type == 3:
                return False
            return True
    

    auth.py

    from rest_framework.authentication import BaseAuthentication
    from rest_framework.exceptions import AuthenticationFailed
    from app01 import models
    import hashlib
    
    def get_token(user_id):
        salt = "shan"
        md = hashlib.md5()
        # 通过id生成随机字符串,并加盐
        md.update(str(user_id).encode("utf8"))
        md.update(salt.encode("utf8"))
        return md.hexdigest()
    
    class Authentication(BaseAuthentication):
        def authenticate(self, request):
            # 服务端不保存token的用户认证
            # 从请求头中取出token和用户的id,再次通过id生成token去校验(这里可改进,将id拼接到token中,这样就无需另外传id)
            token = request.META.get("HTTP_TOKEN")
            user_id = request.META.get("HTTP_ID")
            if user_id:
                confirm_token = get_token(user_id)
                if confirm_token == token:
                    user_obj = models.User.objects.filter(id=user_id).first()
                    # 返回的第一个参数传给request.user,在后面可直接取得登录用户对象
                    return user_obj, True  # request.user,request.auth
            raise AuthenticationFailed("您尚未登录")
    

    settings.py

    REST_FRAMEWORK = {
        # 配置全局的用户登录认证
        "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
        # 配置全局的权限限制
        "DEFAULT_PERMISSION_CLASSES":["app01.service.permission.VIPPermission",]
    }
    

    vies.py

    from rest_framework.response import Response
    from rest_framework.viewsets import ModelViewSet
    from rest_framework.views import APIView
    from app01 import models
    from django.core.exceptions import ObjectDoesNotExist
    from app01.service import auth
    from app01 import modelserializer
    
    class LoginView(APIView):
        authentication_classes = []
    
        def post(self, request):
            respone = {"code": 100, "msg": "登录成功"}
            name = request.data.get("name")
            pwd = request.data.get('pwd')
            try:
                user_obj = models.User.objects.filter(name=name, pwd=pwd).get()
                token = auth.get_token(user_obj.id)
                respone["token"] = token
            except ObjectDoesNotExist as e:
                respone["code"] = 101
                respone["msg"] = "用户名或密码错误"
            return Response(respone)

    总结:

    -写一个权限类
    	class MyPermision(BasePermission):
    		message = '不是超级用户,查看不了'
    		def has_permission(self,request,view):
    			if request.user.user_type==1:
    				return True
    			else:
    				return False
    -局部使用
    	-在视图类中配置:
    		permission_classes=[MyPermision,]
    -全局使用
    	-在setting中配置
    		'DEFAULT_PERMISSION_CLASSES':['自定义的权限类']
    -局部禁用:	
    	permission_classes=[]
    -返回的提示是中文:
    	message=中文

    源码分析

    注:

      权限类使用顺序:先用视图类中的权限类,再用settings里配置的权限类,最后用默认的权限类

  • 相关阅读:
    2020软件工程第四次作业04
    2020软件工程作业02
    2020软件工程作业01
    2020软件工程个人作业06——软件工程实践总结作业
    2020软件工程作业05
    2020软件工程作业00—问题清单
    2020软件工程作业03
    2020软件工程作业02
    2020软件工程作业01
    小小小-冲刺集合
  • 原文地址:https://www.cnblogs.com/penghengshan/p/11134430.html
Copyright © 2011-2022 走看看