权限控制到按钮级别 : 
        1.思路 : 
                由于每个按钮都能认为是一个权限,所以每个按钮都会有一个自己的路径,这些路径都在用户登录时保存在了session中,django在渲染页面之前先进行权限的匹配,如果用户没有某个按钮的权限,那么这个按钮就不会被渲染,从而实现权限的控制.
                重点在于能快速的在session中搜索所有的用户权限,之前在session中保存的数据是以一级菜单的id作为key,所以在遍历时候会占用过多资源,而从数据库中去找也比较浪费时间.所以可以在session中保存权限数据时就以定义的url别名来做key,这样就可以快速匹配权限.
        2.修改表结构,增加name字段保存路径的别名 :
class Permission(models.Model):
'''
权限表
'''
url = models.CharField(max_length=256, verbose_name='权限', unique=True)
title = models.CharField(max_length=32, verbose_name='标题')
menu = models.ForeignKey('Menu', blank=True, null=True)
parent = models.ForeignKey('Permission', blank=True, null=True)
name = models.CharField(max_length=32, verbose_name='URL别名', unique=True) def __str__(self):
return self.title
        3.以上表中的别名字段作为key保存在session中,并保存pemissions__parent__name字段(因为当上表中的permissions__parent_id存在时,pemissions__parent__name即对应的二级权限的name).
for item in permission_query:
permission_dict[item['permissions__name']] = ({
'url':item['permissions__url'],
'pid':item['permissions__parent_id'],
'id': item['permissions__id'],
'title': item['permissions__title'],
'pname': item['permissions__parent__name']
})
        4.通过自定义filter判断是否显示标签 : (注意传参)
@register.filter()
def has_permission(request,name):
if name in request.session.get(settings.PERMISSION_SESSION_KEY):
return True
        5.在前端对每个按钮做判断 :

<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>
        6.注意对session数据变化带来的错误做修改 :
for permission in permission_dict.values():

    if re.match(r'^{}$'.format(permission['url']), url):
pid = permission.get('pid')
id = permission.get('id')
pname = permission.get('pname') #之前没有
if pid:
request.current_menu_id = pid
request.breadcrumb_list.append(
{'title': permission_dict[pname]['title'], 'url': permission_dict[pname]['url']}) #之前为permission_dict[str(pid)]['']
request.breadcrumb_list.append({'title': permission['title'], 'url': permission['url']})

  

 

django中权限控制到按钮级别的更多相关文章

  1. crm 一级菜单排序,二级菜单选中并且展开,非菜单权限的归属,权限粒度控制到按钮级别

    排序 /rbac/templatetags/rbac.py from django import template from django.conf import settings import re ...

  2. rbac之 权限粒度控制到按钮级别

    rbac之 权限粒度控制到按钮级别:  这里的意思就是 如果当前用户,没有这个权限. 那么这个相对应的这个按钮的权限, 就不应该展示.看都不能给看到. 思路: 为每一个权限,设置一个别名.  这里是这 ...

  3. Spring Cloud实战 | 第十一篇:Spring Cloud Gateway 网关实现对RESTful接口权限控制和按钮权限控制

    一. 前言 hi,大家好,这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT实现的统 ...

  4. django通用权限控制框架

    在web项目中根据不同的用户肯定会限制其不同的权限,利用以下模块可以满足日常几乎所有的权限控制 permission_hook.py  # 自定义权限控制,必须返回True/false  ,True表 ...

  5. ASP.NET MVC中权限控制的简单实现

    1.重写AuthorizeAttribute类,用自己的权限控制逻辑重写AuthorizeCore方法 public class MyAuthorizeAttribute : AuthorizeAtt ...

  6. 第十二章:Linux中权限控制实例

    前言 前文对 Linux 中的权限进行了较为透彻的分析.而本文,则在前文的基础上,具体说明如何在代码中进行权限控制. 下面的代码涉及到以下几个方面: 1. 创建文件时设置文件权限 2. 修改文件的默认 ...

  7. Linux 中权限控制实例

    前言 前文对 Linux 中的权限进行了较为透彻的分析.而本文,则在前文的基础上,具体说明如何在代码中进行权限控制. 下面的代码涉及到以下几个方面: 1. 创建文件时设置文件权限 2. 修改文件的默认 ...

  8. Vue 自定义指令实现权限控制(按钮级)

    在用户登陆后,根据用户id读取用户的所有权限数据,放入本地的sessionStorage进行存储(这里我是拿到权限按钮按钮的标识,英文名称.把他们合成一个字符串存储在 btnPowerString 中 ...

  9. vue + django 的权限控制

    用vue做前端页面, Django 提供api, 写了一个后台系统,结合方式是vue打包后的dist目录直接作为Django的静态目录, 这样的好处是不用配置Nginx具体的做法不在这里写了,记一下遇 ...

随机推荐

  1. P4568 飞行路线【分层图最短路】

    题目链接:https://www.luogu.org/problem/P4568 题目大意:给定n个点,m条无向边,k次机会经过边时代价为 0 .给出起点和终点,求其最短路径. 解题思路: 两种方法, ...

  2. 纯C++实现操作配置文件(告别跨平台问题)

    CConfig.h #ifndef _CCONFIG_H #define _CCONFIG_H #include <iostream> #include <string> #i ...

  3. 堆学习笔记(未完待续)(洛谷p1090合并果子)

    上次讲了堆,别人都说极其简单,我却没学过,今天又听dalao们讲图论,最短路又用堆优化,问懂了没,底下全说懂了,我???,感觉全世界都会了堆,就我不会,于是我决定补一补: ——————来自百度百科 所 ...

  4. MongoDB journal 与 oplog,究竟谁先写入?--转载

    MongoDB journal 与 oplog,谁先写入?最近经常被人问到,本文主要科普一下 MongoDB 里 oplog 以及 journal 这两个概念. journal journal 是 M ...

  5. 怎样对小数进行向上取整 / 向下取整 / 四舍五入 / 保留n位小数 / 生成随机数

    1. 向上取整使用: Math.ceil() Math.ceil(0.1); Math.ceil(1.9); 2. 向下取整使用: Math.floor() Math.floor(0.1); Math ...

  6. hdu 1203 转换的01包问题。。。。

    俗话说的话 正难则反.,.  这个基本的思想都用不好的话 回家种田去吧. #include<cstdio> #include<string.h> #include<ios ...

  7. 洛谷 P1540 机器翻译

    链接:https://www.luogu.org/problemnew/show/p1540 题目: 题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译 ...

  8. 踩坑记录-nuxt引入vuex报错store/index.js should export a method that returns a Vuex instance.

    错误 store/index.js代码如下: import Vue from 'vue'; import Vuex from 'vuex'; import city from './moudle/ci ...

  9. [JZOJ5897]密匙--哈希骚操作

    [JZOJ5897]密匙--哈希骚操作 题目链接 太懒了自行Google 前置技能 二分/倍增求LCP e.g TJOI2017DNA 分析 这题看了样例解释才知道什么意思 本以为自己身为mo法师蛤希 ...

  10. TCP/IP及http协议 SOAP REST

    TCP/IP及http协议: TCP/IP协议主要解决数据如何在网络中传输, 而HTTP是应用层协议,主要解决如何包装数据 SOAP:简单对象访问协议(Simple Object Access Pro ...