权限管理Django中间件

权限管理django中间件

from django.http import JsonResponse
from django.http.request import HttpRequest
from django.http.response import HttpResponse
from django.utils.deprecation import MiddlewareMixin
from django.apps import apps
import jwt

class MyMiddleware(MiddlewareMixin):
    def __init__(self, get_response=None):
        """
        初始化中间件,获取必要的模型引用。
        
        参数:
            get_response (callable, optional): 链中的下一个中间件。
        """
        super().__init__(get_response)
        # 获取必要的模型
        self.UserModel = apps.get_model('userlogin', 'User')
        self.UserRoleModel = apps.get_model('usermanage', 'UserRole')
        self.RolePermissionModel = apps.get_model('usermanage', 'RolePermission')
        self.RouteModel = apps.get_model('usermanage', 'Route')
    
    def __call__(self, request: HttpRequest) -> HttpResponse:
        """
        处理传入的请求。

        参数:
            request (HttpRequest): 传入的HTTP请求。

        返回:
            HttpResponse: HTTP响应。
        """
        try:
            # 从Authorization头部提取JWT令牌
            token = request.headers['Authorization'].split(' ')[0]
            # 解码令牌(注意:此处暂时禁用了签名验证)
            user = jwt.decode(token, algorithms=["RS256"], options={"verify_signature": False})
            # 使用解码后的令牌中的sub(主题)获取用户ID
            user_id = self.UserModel.objects.get(sub=user['sub']).user_id
            # 获取与用户关联的角色
            user_role = self.UserRoleModel.objects.filter(user_id=user_id).values_list('role_id', flat=True)
            # 获取与用户角色相关联的权限
            user_permission = self.RolePermissionModel.objects.filter(role_id__in=user_role).values_list('permission_id', flat=True)
            # 获取用户允许的URL
            permitted_urls = self.RouteModel.objects.filter(permission_id__in=user_permission).values_list('route_url', flat=True)
            # 判断当前请求的URL是否在用户允许的URL列表中
            if request.path in permitted_urls:
                # 如果是,则继续处理请求
                return self.get_response(request)
            else:
                # 如果不是,则返回权限不足的JSON响应
                return JsonResponse({'code': 403, 'msg': '没有权限'})
        except KeyError:
            return JsonResponse({'code': 400, 'msg': 'Authorization头部缺少令牌'})
        except jwt.DecodeError:
            return JsonResponse({'code': 401, 'msg': '令牌无效或过期'})
        except self.UserModel.DoesNotExist:
            return JsonResponse({'code': 401, 'msg': '用户不存在'})
        except Exception as e:
            return JsonResponse({'code': 500, 'msg': '服务器内部错误'})


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值