首页 > 其他分享 >3 权限粒度控制到按钮

3 权限粒度控制到按钮

时间:2022-08-29 12:03:16浏览次数:83  
标签:__ title url request item 粒度 按钮 权限 permissions

不同用户登录系统时候,根据权限不同来控制是否限制指定按钮

第一步:修改表结构

class Permission(models.Model):
    """
    权限表
    """
    title = models.CharField(verbose_name='标题', max_length=32)
    url = models.CharField(verbose_name='含正则的URL', max_length=128)
    name = models.CharField(verbose_name="URL别名", max_length=32, unique=True)

    menu = models.ForeignKey(verbose_name='所属菜单', to='Menu', null=True, blank=True, help_text='null表示不是菜单;非null表示是二级菜单',
                             on_delete=models.CASCADE)

    pid = models.ForeignKey(verbose_name="关联的权限", to="Permission", null=True, blank=True, related_name="parents",
                            help_text="对于非菜单权限需要选择一个可以成为菜单的权限,用于做默认展开和选中菜单",
                            on_delete=models.CASCADE)

    def __str__(self):
        return self.title

image


第二步:修改初始化信息

init_permission.py
from django.conf import settings


def init_permission(current_user, request):
    """
    用户权限信息的初始化
    :param current_user:当前用户对象
    :param request:当前用户的请求数据
    :return:
    """
    # 根据当前用户信息获取此用户拥有的所有权限
    permission_queryset = current_user.roles.filter(permissions__isnull=False).values(
        "permissions__id",
        "permissions__title",
        "permissions__url",
        "permissions__name",
        "permissions__pid__id",
        "permissions__pid__title",
        "permissions__pid__url",
        "permissions__menu__id",
        "permissions__menu__title",
        "permissions__menu__icon", ).distinct()

    # 获取权限+菜单信息,写入session
    menu_dict = {}
    permissions_dict = {}
    for item in permission_queryset:
        permissions_dict[item["permissions__name"]] = {
                "id": item["permissions__id"],
                "title": item["permissions__title"],
                "url": item["permissions__url"],
                "pid": item['permissions__pid__id'],
                "p_title": item["permissions__pid__title"],
                "p_url": item["permissions__pid__url"]
            }

        menu_id = item["permissions__menu__id"]
        if not menu_id:
            continue
        node = {"id": item["permissions__id"], "title": item["permissions__title"], "url": item["permissions__url"]}
        if menu_id in menu_dict:
            menu_dict[menu_id]["children"].append(node)
        else:
            menu_dict[menu_id] = {
                "title": item["permissions__menu__title"],
                "icon": item["permissions__menu__icon"],
                "children": [node, ]
            }

    request.session[settings.PERMISSION_SESSION_KEY] = permissions_dict
    request.session[settings.MENU_SESSION_KEY] = menu_dict


第三步:修改中间件

rbac.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
from django.conf import settings


class RbacMiddleware(MiddlewareMixin):
    """
    用户权限信息校验
    """

    def process_request(self, request):
        """
        当用户请求刚进入时候出发执行
        :param request:
        :return:
        """

        """
        1. 获取当前用户请求的URL
        2. 获取当前用户在session中保存的权限列表 ['/customer/list/','/customer/list/(?P<cid>\\d+)/']
        3. 权限信息匹配
        """
        current_url = request.path_info
        for valid_url in settings.VALID_URL_LIST:
            if re.match(valid_url, current_url):
                # 白名单中的URL无需权限验证即可访问
                return None

        permission_dict = request.session.get(settings.PERMISSION_SESSION_KEY)
        if not permission_dict:
            return HttpResponse('未获取到用户权限信息,请登录!')

        flag = False
        url_record = [
            {"title": "首页", "url": "#"}
        ]

        for item in permission_dict.values():
            reg = "^%s$" % item["url"]
            if re.match(reg, current_url):
                flag = True
                request.current_selected_permission = item["pid"] or item["id"]
                if not item["pid"]:
                    url_record.extend([{"title": item["title"], "url": item["url"], "class":"active"}])
                else:
                    url_record.extend([
                        {"title": item["p_title"], "url": item["p_url"]},
                        {"title": item["title"], "url": item["url"], "class":"active"},
                    ])
                request.url_record = url_record
                break
        if not flag:
            return HttpResponse('无权访问')


第四步:filter过滤

rbac.py
from django.template import Library
from django.conf import settings

register = Library()

@register.filter
def has_permission(request, name):
    """最多只能传2个参数,做权限过滤"""
    if name in request.session[settings.PERMISSION_SESSION_KEY]:
        return True

第五步:模板应用

customer_list.html
{% extends 'layout.html' %}
{% load rbac %}

{% block content %}

    <div class="luffy-container">
        <div class="btn-group" style="margin: 5px 0">

            {% if request|has_permission:"customer_add" %}
                <a class="btn btn-default" href="/customer/add/">
                    <i class="fa fa-plus-square" aria-hidden="true"></i> 添加客户
                </a>
            {% endif %}
            {% if request|has_permission:"customer_import" %}
                <a class="btn btn-default" href="/customer/import/">
                    <i class="fa fa-file-excel-o" aria-hidden="true"></i> 批量导入
                </a>
            {% endif %}

        </div>
        <table class="table table-bordered table-hover">
            <thead>
            <tr>
                <th>ID</th>
                <th>客户姓名</th>
                <th>年龄</th>
                <th>邮箱</th>
                <th>公司</th>

                {% if request|has_permission:"customer_del" or request|has_permission:"customer_edit" %}
                    <th>选项</th>
                {% endif %}

            </tr>
            </thead>
            <tbody>
            {% for row in data_list %}
                <tr>
                    <td>{{ row.id }}</td>
                    <td>{{ row.name }}</td>
                    <td>{{ row.age }}</td>
                    <td>{{ row.email }}</td>
                    <td>{{ row.company }}</td>

                    {% if request|has_permission:"customer_del" or request|has_permission:"customer_edit" %}
                        <td>
                            {% if request|has_permission:"customer_edit" %}
                                <a style="color: #333333;" href="/customer/edit/{{ row.id }}/">
                                    <i class="fa fa-edit" aria-hidden="true"></i></a>
                            {% endif %}
                            {% if request|has_permission:"customer_del" %}
                                <a style="color: #d9534f;" href="/customer/del/{{ row.id }}/"><i
                                        class="fa fa-trash-o"></i></a>
                            {% endif %}
                        </td>
                    {% endif %}

                </tr>
            {% endfor %}
            </tbody>
        </table>
    </div>
{% endblock %}

权限粒度控制到按钮代码下载

标签:__,title,url,request,item,粒度,按钮,权限,permissions
From: https://www.cnblogs.com/it-lkp/p/16635454.html

相关文章

  • SSH命令权限不足
    ssh:errorwhileloadingsharedlibraries:libcrypto.so.1.1:cannotopensharedobjectfile:Nosuchfileordirectory-bash:/usr/bin/ssh:权限不够处理其它问......
  • 点击按钮收藏
    分析   后台代码 RouteServlet类:/***添加收藏*@paramrequest*@paramresponse*@throwsServletException*@throws......
  • 让你的PLC支持多连接,多电脑同时访问一个PLC 连接PLC的权限设置,PLC同时多连接
    要明白一个技术,首先要明白它到底是解决什么问题的?你是不是有以下的困扰1.我有个三菱的PLC,只能配置一个端口,但是有多台电脑需要从PLC进行读写,因为三菱是单链接的,所以直接读......
  • 通过自定义指令对button进行权限的校验
    通过自定义指令对button进行权限的校验场景:左侧菜单栏通过调接口获取,每一个菜单下的还有该菜单下的button的权限操作,在mentType为2时,该children就是button权限列表1.先获......
  • 启动HDFS伪分布式环境时报权限错误
    问题描述操作系统:Ubuntu18.04LTSHDFS版本:hadoop-3.2.3普通用户登录,参照官方文档在单机上安装伪分布式环境时,启动HDFS报权限错误。具体报错信息如下:$./sbin/start-df......
  • el-button点击了按钮会出现保留点击的状态
    问题el-button点击了按钮之后,将鼠标移出按钮,会出现保留点击的状态再查看它的css样式后,可以看到官方默认设置有:focus的状态规则解决办法在el-button的css里自定义或者......
  • U8 V13.0小白入门开发记录五-------------------自定义按钮开发(VB)调试
    这里继续延用上一章所写的内容举例。在上一章(U8V13.0小白入门开发记录四)创建完工程并写完方法后,如何调试我们的业务逻辑呢?1.首先登录我们的U8V13客户端     ......
  • linux 的文件权限案列
    需求:技术部门人员可以相互查看,但不能删除和修改别人的文件,其他部门人员不能查看,但领导组可以且只能查看。设计:技术部:组jishu;人员js1,js2领导:组lingd;人员......
  • .NET代码审计之权限校验不严谨绕过
    0x01案例一Q:有位师傅发现某个应用存在SQL注入,后来师傅拿到了源码发现存在SQL注入的地方有个checksession方法验证权限,理论上应该要登陆,但是实际黑盒不需要登陆就注入了......
  • 根目录被赋予777 -R权限后的处理过程
    解决某研发手残导致的系统宕机问题的处理过程背景2022.8.8公司一台服务器出现了宕机的现象:所有的人都无法远程,都提示密码错误.但是网络还是通的.2022.8.12出......