专栏首页Python 学习day80-<权限组件>-基本流程以及部分代码
原创

day80-<权限组件>-基本流程以及部分代码

1.inclusion_tag使用的时候,前台的传参,复习向

模板中
后台

2.如何组织权限

1.把用户、角色、权限这三张表建好,以及这三张表的关联关系

from django.db import models


class Menu(models.Model):
    """
    表层菜单-->点击展开-->点击收起
    """
    title = models.CharField(max_length=32)
    icon = models.CharField(max_length=32, null=True, blank=True)

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = '收合表层菜单'
        verbose_name_plural = '收合表层菜单'


class Permission(models.Model):
    """
    权限表(URL)
    """
    title = models.CharField(max_length=32, verbose_name='URL名称')
    URL = models.CharField(max_length=32, verbose_name='权限URL')
    # is_menu = models.BooleanField(verbose_name='是否具是菜单', default=False)
    # icon = models.CharField(max_length=32, null=True, blank=True)
    # 并不是所有权限都在左侧伸缩表单里面,所以可以不指定外键,也可以不填
    menu = models.ForeignKey(to='Menu', null=True, blank=True)

    class Meta:
        verbose_name_plural = '权限表'
        verbose_name = '权限表'

    def __str__(self):
        return self.title


class Role(models.Model):
    """
    角色表(角色和权限之间多对多)
    """
    role_name = models.CharField(max_length=32, verbose_name='角色(职务)名称')
    permissions = models.ManyToManyField(to='Permission', verbose_name='所拥有的权限', blank=True)

    class Meta:
        verbose_name = '角色(权限)表'
        verbose_name_plural = '角色(权限)表'

    def __str__(self):
        return '{}-{}'.format(self.role_name, self.permissions)


class User(models.Model):
    """
    用户表(用户和角色之间多对多)
    """
    name = models.CharField(max_length=32, verbose_name='用户名')
    password = models.CharField(max_length=32, verbose_name='密码')
    roles = models.ManyToManyField(to='Role', verbose_name='角色(职务)', blank=True)

    class Meta:
        verbose_name = '用户表'
        verbose_name_plural = '用户表'

    def __str__(self):
        return self.name

2.数据库迁移

3.设置登录url白名单以及中间件校验白名单

4.在登录的时候,将权限写进session

from django.conf import settings


def ini_session(request, user, username):
    """
    将权限写进session
    :return:
    """
    # 获取权限列表
    permission_list = \
        user.roles.filter(permissions__URL__isnull=False).values(
            'permissions__URL',  # 权限的url
            'permissions__title',  # 权限 url 的名称
            'permissions__menu_id',
            'permissions__menu__title',  # 可以做二级菜单的url的一级菜单的名称
            'permissions__menu__icon',  # 可以做二级菜单的url的一级菜单的图标
        ).distinct()

    # 查看当前用户都有哪些权限
    print('用户权限总列表{}'.format(permission_list))
    # 空列表接收权限
    all_permissions = []
    # 空字典接收菜单
    all_menus = {}
    for i in permission_list:
        # 添加权限进列表
        all_permissions.append(i['permissions__URL'])
        # 添加菜单列表
        menu_id = i['permissions__menu_id']
        if not menu_id:
            continue
        if menu_id not in all_menus:
            all_menus[menu_id] = {  # 如果id不在里面就新建
                'title': i['permissions__menu__title'],  # 伸缩菜单名
                'icon': i['permissions__menu__icon'],  # 伸缩菜单图标
                'children': [
                    {
                        'title': i['permissions__title'],  # 伸缩菜单 子url 名称
                        'url': i['permissions__URL']  # 伸缩菜单 子url
                    }
                ]
            }
        else:  # 如果id已经在里面,就追加children
            all_menus[menu_id]['children'].append(
                {
                    'title': i['permissions__title'],  # 伸缩菜单 子url 名称
                    'url': i['permissions__URL']  # 伸缩菜单 子url
                }
            )

    print(all_menus)
    # 写权限进session
    request.session[settings.PERMISSION_SESSION_KEY] = all_permissions
    # 写菜单进session
    request.session[settings.MENU_KEY] = all_menus
    # 写用户名进session
    request.session[settings.USERNAME] = username

5.在中间件里面对权限(k而已访问的URL)进行判断

import re

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


class PermissionMiddleware(MiddlewareMixin):
    """
    权限中间件request
    """

    @staticmethod
    def process_request(request):
        current_url = request.path_info

        # step1:首先校验白名单
        for i in settings.WHITE_URL_LIST:
            if re.match(i, current_url):
                return
            
        # step2:非白名单URL访问对权限进行校验
        permission_list = request.session.get(settings.PERMISSION_SESSION_KEY, '')
        menu_list = request.session.get(settings.MENU_KEY, '')
        # print('中间件校验,当前用户的权限是{}'.format(permission_list))
        # [print('中间件校验,当前用户{}的菜单是{}'.format(request.session.get(settings.USERNAME, ''), i)) for i in menu_list]

        for url in permission_list:
            # 获取到每可以访问的正则 URL
            permission_url = ''.join(url)
            # 正则 URL 匹配当前URL
            ret = re.match('^{}$'.format(permission_url), current_url)
            if ret:
                return
        return HttpResponse('没有权限访问!')
    pass

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 13 个适合『中级开发者』练手的项目

    该项目设计的主要目标是聚合内容。首先,我们需要知道内容聚合器从哪些站点获取内容。然后,使用请求库来发送 HTTP 请求,并使用 BeautifulSoup 解析...

    小小詹同学
  • HTTP 协议格式

    参考:https://www.cnblogs.com/breka/articles/9791664.html

    用户6029108
  • 渗透测试 跨站攻击手法剖析

    上一节讲到了渗透测试中xss跨站攻击检测方法和防护,这一节也是关于跨站攻击的另一个手法CSRF,很多客户找到我们Sinesafe想要了解更多的跨站攻击检测方法以...

    网站安全专家
  • 【JS】376- Axios 使用指南

    1、 利用npm安装npm install axios --save 2、 利用bower安装bower install axios --save 3、 直接利...

    pingan8787
  • [视频教程] 配置多版本PHP并存运行PHP5.6与PHP7.3

    经常有一些项目需要使用不同版本的PHP运行环境,比如有的老项目需要使用5.3版本,有的新项目比如laravel需要使用7.2以上版本,那么在一台机器上如何多版本...

    陶士涵
  • 如何基于Restful ABAP Programming模型开发并部署一个支持增删改查的Fiori应用

    Jerry之前的文章30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用 发布之后,有朋友问我,“没错, 我是在你...

    Jerry Wang
  • phpstudy RCE 复现

    用户5878089
  • 网站安全防护公司渗透测试执行命令漏洞

    哈喽大家好,近期我们Sine安全对客户平台进行渗透测试的时候,发现有一些命令执行的漏洞测试语句和函数,导致服务器被提权被入侵,上一节提到XSS跨站脚本攻击检测方...

    网站安全专家
  • Flask支持正则路径匹配

    •default([^/].*?)•string•int•float•path•uuid

    上帝De助手
  • 渗透测试该如何全面检测网站漏洞

    昨天给大家普及到了渗透测试中执行命令漏洞的检测方法,今天抽出时间由我们Sine安全的渗透工程师来讲下遇到文件包含漏洞以及模板注入漏洞的检测方法和防御手段,本文仅...

    网站安全专家

扫码关注云+社区

领取腾讯云代金券