首页 > 其他分享 >基于session的认证权限中间件

基于session的认证权限中间件

时间:2024-10-09 16:47:32浏览次数:8  
标签:sms return name url 中间件 request session login 权限

from django.utils.deprecation import MiddlewareMixin
from django.conf import settings
from django.shortcuts import redirect, HttpResponse, render
from django.http import JsonResponse


class Context:
    def __init__(self, role, id, name):
        self.role = role
        self.id = id
        self.name = name


class AuthMiddleware(MiddlewareMixin):

    def is_white_url_by_path_info(self, request):
        if request.path_info in ["/login/", "/sms/login/", '/send/sms/']:
            return True

    def is_white_url_by_name(self, request):
        url_name = request.resolver_match.url_name
        if url_name in ["login", "sms_login", "send_sms"]:
            return True

    def process_request(self, request):
        return

        # 0.白名单,有些无需登录就能访问的页面【login】【sms/login】【send/sms】
        # path('login/', account.login, name='login'),
        # path('sms/login/', account.sms_login, name='sms_login'),
        # path('send/sms/', account.send_sms, name='send_sms'),
        # if request.path_info in ["/login/", "/sms/login/", '/send/sms/']:
        #     return
        if self.is_white_url_by_path_info(request):
            return

        # 1.去session中读取用户信息
        # request.session["user_info"] = {
        #     "role": mapping[role],  # "ADMIN"  "CUSTOMER"
        #     "id": user_object.id,
        #     "name": user_object.username,
        # }
        data_dict = request.session.get(settings.NB_SESSION_KEY)

        # 2.不存在->未登录
        if not data_dict:
            # return redirect("/login/")
            return redirect(settings.NB_LOGIN_NAME)

        # 3.存在,则继续往后走
        request.nb_user = Context(**data_dict)
        # print(request.nb_user.name)
        # print(request.nb_user.id)
        # print(request.nb_user.role)

    def process_view(self, request, callback, *args, **kwargs):

        # 0.白名单,有些无需登录就能访问的页面【login】【sms/login】【send/sms】
        # path('login/', account.login, name='login'),
        # path('sms/login/', account.sms_login, name='sms_login'),
        # path('send/sms/', account.send_sms, name='send_sms'),
        # url_name = request.resolver_match.url_name
        # if url_name in ["login", "sms_login", "send_sms"]:
        #     return
        if self.is_white_url_by_name(request):
            return
        # 1.去session中读取用户信息
        # request.session["user_info"] = {
        #     "role": mapping[role],  # "ADMIN"  "CUSTOMER"
        #     "id": user_object.id,
        #     "name": user_object.username,
        # }
        data_dict = request.session.get(settings.NB_SESSION_KEY)

        # 2.不存在->未登录
        if not data_dict:
            # return redirect("/login/")
            return redirect(settings.NB_LOGIN_NAME)

        # 3.存在,则继续往后走
        request.nb_user = Context(**data_dict)
        # print(request.nb_user.name)
        # print(request.nb_user.id)
        # print(request.nb_user.role)


class AuthMiddlewarePathInfo(MiddlewareMixin):

    def is_white_url_by_path_info(self, request):
        if request.path_info in settings.NB_WHITE_URL:
            return True

    def process_request(self, request):
        if self.is_white_url_by_path_info(request):
            return
        # 1.去session中读取用户信息
        data_dict = request.session.get(settings.NB_SESSION_KEY)

        # 2.不存在->未登录
        if not data_dict:
            return redirect(settings.NB_LOGIN_NAME)

        # 3.存在,则继续往后走
        request.nb_user = Context(**data_dict)


class PermissionMiddleware(MiddlewareMixin):

    def is_white_name(self, request):
        url_name = request.resolver_match.url_name
        if url_name in settings.NB_WHITE_PERMISSION_NAME:
            return True

    def is_ajax(self, request):
        return request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'

    def process_view(self, request, callback, *args, **kwargs):
        # 1.有些不需要做权限校验
        if self.is_white_name(request):
            return

        # 2.获取用户登录信息
        role = request.nb_user.role

        # 3.获取当前用户所有的权限
        permission_dict = settings.NB_PERMISSIONS[role]

        # 4.权限校验
        url_name = request.resolver_match.url_name
        if url_name in permission_dict:
            return

        # 5.无权限(是否是ajax请求)
        # X-Requested-With: XMLHttpRequest
        # request封装请求相关的所有数据 + 方法 method/path_info/resolver_match
        # return HttpResponse("无权访问")
        # return render(request, '404.html')
        if self.is_ajax(request):
            return JsonResponse({'status': False, 'msg': "无权访问"})
        return render(request, '404.html')

settings.py

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    # 'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    "utils.md.AuthMiddlewarePathInfo",
    "utils.md.PermissionMiddleware",
]

标签:sms,return,name,url,中间件,request,session,login,权限
From: https://www.cnblogs.com/cloud-2-jane/p/18454601

相关文章

  • Google:敏感信息访问权限和 API 政策更新
    目录公布时间公布内容内容有关GooglePlay照片和视频权限政策的详细信息截止时间相关问题公布时间公布日期:2023-10-25公布内容内容为向用户提供更注重隐私保护的体验,我们将推出“照片和视频访问权限”政策,以减少获准针对照片/视频请求广泛权限(READ_......
  • Linux主机创建新用户并添加root权限
    1.添加用户设置密码useradd-d<homedir>-m-s/bin/bash<username>passwd<username><password>#为该用户设定密码为<password>useradd参数<homedir>:用户家目录,一般为/home/username-s:指定shell到/bin/bash-d:指定其home目录为<homedir>-m:如果指定的home目录......
  • MongoDB 用户权限管理,复制集,分片集群,备份恢复 rocky使用
    1MongoDB介绍1.4什么时候使用MongoDB1.数据量是有亿万级或者需要不断扩容2.需要2000-3000以上的读写每秒3.新应用,需求会变,数据模型无法确定4.需要整合多个外部数据源5.系统需要99.999%高可用6.系统需要大量的地理位置查询7.系统需要提供最小的latency8.管理的主要数......
  • Mybatis——SqlSessionFactoryBuilder工厂模式
    Mybatis——SqlSessionFactoryBuilder工厂模式工厂模式题外话合集总览:Mybatis框架梳理  说一下我的理解:设计模式是对项目工程中代码结构的设计和抽象,有了这种设计和抽象,系统才有了扩展性。记住了模式的角色、组成、UML类图,只是记住了模式的形,类似武术中的拳法套......
  • 可以成功重置帝国CMS 的后台密码,重新获得后台管理权限
    工具/原料电脑MySQL数据库管理软件(如phpMyAdmin)方法/步骤1.5.1至7.0版本登录phpMyAdmin访问您的服务器上的phpMyAdmin页面,通常地址为 http://yourdomain.com/phpmyadmin。输入数据库用户名和密码登录。选择帝国CMS安装所在的数据库在phpMyAdmin主......
  • Linux_权限理解(详细PLUS)Gu
    1.用户Linux下有两种用户:超级用户(root)和普通用户;超级用户:可以再linux系统下做任何事情,不受限制普通用户:在linux下做有限的事情超级用户的命令提示符是"#",普通用户的命令提示符是"$"超级用户:普通用户:2.用户切换用户间切换:su+用户名//可用exit回退到原用户1)普......
  • Session
    Sessionkeywords:im即时通讯官网介绍:Session是一款端到端加密的消息发送工具,可最大限度地减少敏感元数据,专为那些想要绝对隐私和免受任何形式监视的人设计和构建。从signalfork的项目,支持跨平台,去除了使用手机号注册的限制。官网:https://getsession.org/github地址:......
  • PbootCMS网站提示:“会话目录写入权限不足”的解决办法
    当使用PbootCMS时出现“会话目录写入权限不足”的错误提示,通常是因为某些目录的权限设置不当。可以通过调整这些目录的权限来解决这个问题。解决方案调整目录权限对 config、data 和 runtime 目录分别设置适当的权限。操作步骤1.连接到服务器使用FTP客户端或S......
  • 中间件漏洞
    中间件漏洞常见的web中间件iisapachetomcatnginxjbossWeblogicWebSphereIIS6x篇1.1PUT漏洞1.漏洞描述IISServer在Web服务扩展中开启了WebDAV,配置了可以写入的权限,造成任意文件上传。版本:IIS6.02.漏洞复现1)开启WebDAV和写权限3.漏洞复现过程1)直接抓包......
  • Linux_权限理解(详细PLUS)
    1.用户Linux下有两种用户:超级用户(root)和普通用户;超级用户:可以再linux系统下做任何事情,不受限制普通用户:在linux下做有限的事情超级用户的命令提示符是"#",普通用户的命令提示符是"$"超级用户:普通用户:2.用户切换用户间切换:su+用户名//可用exit回退到原用户1)普通......