需求分析:
1.判断用户是否登陆,未登陆就不能进入其他页面
2.为用户分配不同的权限,用户的操作只能在权限范围之内
3.将用户可操作的权限显示在页面山,点击能进入该页面操作

模型表的建立

1.对每个用户建立角色,每个角色有着不同的权限
2.权限的字段要设有相应的权限操作路径和操作名称
3.用户可有多个角色,每个角色可有多个用户。用户和角色:ManyToMany
4.每个角色可有多个权限,同一个权限也可被多个用户使用 角色和权限:ManyToMany
from django.db import models
# Create your models here.
class UseInfo(models.Model):
username=models.CharField(max_length=25,verbose_name='用户名')
passwd=models.CharField(max_length=25,verbose_name='密码')
roles=models.ManyToManyField(to="Role",verbose_name='角色')
def __str__(self):
return self.username
class Role(models.Model):
title=models.CharField(max_length=32,verbose_name='角色')
permissions=models.ManyToManyField(to="Permission",verbose_name='权限')
def __str__(self):
return self.title
class Permission(models.Model):
title=models.CharField(max_length=32,verbose_name="权限")
url=models.CharField(max_length=255,verbose_name="执行路径")
code=models.CharField(max_length=32,verbose_name='权限代号')
def __str__(self):
return self.title

2.用户登陆后,设置session

用户登陆之后,将用户id和权限注册到session中
if user:
# 向session注入user信息
request.session["user_id"] = user.pk
# 向session注入当前登录人的权限列表
from Rbac.service.rbac import init_permission
init_permission(user,request)
return redirect("/index/")

用建个py文件注册用户权限

def init_permission(user,request):
##多对多的关系,因此使用all
permissions=user.roles.all().values("permissions__url","permissions__title","permissions__code")
#print(permissions)
#< QuerySet[{'permissions__url': '/Xadmin/Rbac/useinfo/', 'permissions__title': '查看用户', 'permissions__code': 'list'}
permission_list=[]
for perm in permissions:
permission_list.append(perm.get("permissions__url"))
#将权限注册到session中
request.session["permission_list"] = permission_list

3.设置中间件

对用户的请求做出判断,判断出该用户当前请求是否符合要求,对于用户的每次请求,设置中间件来判断
1.登陆,主页,这些路径不设置验证,让所有用户都可访问
white_url=["/login/","/index/"]
if current_path in white_url:
return None
2.进入查看,修改页面时,判断是否有这些权限
['/Xadmin/Rbac/useinfo/', '/Xadmin/Rbac/useinfo/add/', '/Xadmin/Rbac/useinfo/change/(\\d+)/', '/Xadmin/Rbac/useinfo/del/(\\d+)/']
permission_list=request.session.get("permission_list")
print("他是:",permission_list)
if current_path not in permission_list:
return HttpResponse("没有权限")

但是在点击编辑和删除时,却显示没有权限,原因?
点编辑和删除时由于有参数,回显示具体的值,/Xadmin/Rbac/useinfo/change/1/,而permission_list中给却是'/Xadmin/Rbac/useinfo/change/(\\d+)/'
因此匹配不上,显示无权限。应该用正则匹配完成
permission_list=request.session.get("permission_list")
for permission in permission_list:
ret=re.search(permission,current_path)
if ret:return None
return HttpResponse("没有权限")
此时更换用户,此用户只有查看权限:
['/Xadmin/Rbac/useinfo/', '/Xadmin/Rbac/role/']
在访问/Xadmin/Rbac/role/add/时,却能访问成功,原因?
在匹配时,匹配的规则是/Xadmin/Rbac/role/,匹配对象/Xadmin/Rbac/role/add/,
匹配的结果为/Xadmin/Rbac/role/,ret为真,会通过验证
因此要限制匹配对象开始值和结束值
for permission in permission_list:
permission="^%s$"%permission
ret=re.search(permission,current_path)
if ret:return None
return HttpResponse("没有权限")

3.设置admin

让所有用户都能进入admin,因此将admin设置到白名单中,此时若仍用下面这种该方法,会出问题
white_url=["/login/","/index/","/admin/"]
if current_path in white_url:
return None
进入admin后,会发现地址栏出现变化:/admin/login/?next=/admin/
此时在用in,则当前地址匹配不到admin,因此在匹配时,让用正则进行匹配
white_url=["/login/","/index/","/admin/*"]
for url in white_url:
url="^%s"%url
ret=re.search(url,current_path)
if ret:return None
由于admin有参数,此时不能加$
设置中间件
 

4.页面左侧显示该用户的权限

显示的权限名是个a标签,当点击时,执行该操作,因此,编辑和删除权限不能显示出来。
在向session中注册时,将添加和查看的url和对应的操作名也注册进去,但是谮言给判断当前url时哪种操作?
可以为权限表新添个code字段,来描述url,如增加操作,就将code设置为add,显示操作,设置为list,通过判断code字段进行添加
def init_permission(user,request):
##多对多的关系,因此使用all
permissions=user.roles.all().values("permissions__url","permissions__title","permissions__code")
#print(permissions)
#< QuerySet[{'permissions__url': '/Xadmin/Rbac/useinfo/', 'permissions__title': '查看用户', 'permissions__code': 'list'}
permission_list=[]
menu_permission={}
for perm in permissions:
permission_list.append(perm.get("permissions__url"))
if perm.get("permissions__code")=="list" or perm.get("permissions__code")=="add":
menu_permission[ perm.get("permissions__title")]=perm.get("permissions__url")
#将权限注册到session中
request.session["permission_list"] = permission_list
request.session["menu_permission"]= menu_permission
在页面上将权限菜单显示在左边,应将其固定,即页面往下拉时,该菜单仍在这个位置,要用到 position: fixed这个属性,
对于文本内容用到overflow: auto和 position: fixed

Xadmin权限管理的更多相关文章

  1. django 基于proxy实现用户权限管理

    项目中经常会遇到用户权限管理的问题,django adminsite已经提供非常实用的用户权限管理机制.不过有些时候,我们希望根据相关用户属性来过滤adminsite中显示的内容.下文将结束如何实现: ...

  2. Admin后台权限管理、三大认证

    目录 APIView的请求生命周期 三大认证规则 权限六表 自定义User表 详细配置演示 models.py setting.py admin.py 使用过程: 控制填写信息的字段 控制添加权限 控 ...

  3. Android权限管理之RxPermission解决Android 6.0 适配问题

    前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...

  4. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  5. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  6. SpringMVC+Shiro权限管理【转】

    1.权限的简单描述 2.实例表结构及内容及POJO 3.Shiro-pom.xml 4.Shiro-web.xml 5.Shiro-MyShiro-权限认证,登录认证层 6.Shiro-applica ...

  7. Android6.0运行时权限管理

    自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装 ...

  8. Oracle 表空间和用户权限管理

    一. 表空间 Oracle数据库包含逻辑结构和物理结构. 数据库的物理结构指的是构成数据库的一组操作系统文件. 数据库的逻辑结构是指描述数据组织方式的一组逻辑概念以及它们之间的关系. 表空间是数据库逻 ...

  9. [Django]用户权限学习系列之权限管理界面实现

    本系列前三章: http://www.cnblogs.com/CQ-LQJ/p/5604331.htmlPermission权限基本操作指令 http://www.cnblogs.com/CQ-LQJ ...

随机推荐

  1. linux 的常用命令(1)

    1.关于ls [选项][目录名] -a  列出包括.a开头的隐藏文件的所有文件-A  通-a,但不列出"."和".."-l  列出文件的详细信息-c  根据ct ...

  2. CentOS7怎样安装MySQL5.7.22

    wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm下载mysql源安装包 yum install mysq ...

  3. ldconfig 让安装的 php 的rdkafka生效

    原文:https://www.cnblogs.com/schips/p/10183111.html linux中ldconfig的使用介绍   ldconfig是一个动态链接库管理命令,其目的为了让动 ...

  4. Python爬取微信公众号素材库

    这是我的之前写的代码,今天发布到博客园上,说不定以后需要用. 开始: #coding:utf-8 import werobot import pymongo   class Gongzhonghao( ...

  5. 基于h5+的微信登录,hbuilder打包

    1.打开app项目的manifest.json的文件,选择模块权限配置,将OAuth(登录鉴权)模块添加至已选模块中 2.选择SDK配置,在plus.oauuth·登录鉴权中,勾选□ 微信登录,配置好 ...

  6. [俺们学校的题]伪.GCD

    GCD 题面: 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 思路: 首先两个数gcd(x,y)=p为质数,那么令x=k1*p,y=k2*p,由于是最 ...

  7. Linux sudo权限绕过(CVE-2019-14287)

    2019年10月14日,Sudo官方发布了Sudo 1.8.28版本,其中包含sudo root权限绕过漏洞的补丁修复. 此漏洞编号是CVE-2019-14287,当sudo配置为允许用户以任意方式运 ...

  8. 洛谷 P1199 三国游戏 题解

    每日一题 day18 打卡 Analysis 贪心 假如小A先选最大的[5,4],虽然电脑必须选一个破坏, 我们可以理解为5和4都属于小A的,假如后面未被破坏的最大值无论是和5相关还是和4相关,必然还 ...

  9. 汇编语言笔记 CALL和RET指令

    转载地址:http://www.cnblogs.com/dennisOne ☞模块化程序设计 模块化程序设计 汇编语言通过call和ret指令实现了模块化程序设计.可以实现多个相互联系.功能独立的子程 ...

  10. redis堵死致数据清空

    情景: zy的链路监控突然都恢复,而且在哪个时间段zabbix中显示回复,也发送了告警,但是实际上告警并没有发出来.这是不可能的情况,应该是redis缓存中的数据都被清空了,没有认为干预,需解决问题 ...