Django之管理权限
什么是权限:
谁对什么资源能做什么操作。
管理权限的实现有很多,这里实现一个最简单的管理权限的实现方式:rbac ( role based access control )
实现的一个基本思路:
一张user用户表,一张role角色表,一张permission权限表
其中,用户与角色是多对多的关系,角色和权限是多对多的关系
用户登录后,通过用户可以获取当前登录人的所有权限,并设置session值(request.session["permission_list"] = 值)
然后设置中间件,在用户登录时,设置一个白名单,如果用户没有登录就去登录,如果登录就直接从session中取出session_list权限列表,正则匹配这个权限列表,如果匹配上,返回None,否则,返回响应没有访问权限。并且用户可以在左侧菜单查看自己的访问权限有哪些。
首先第一步:表单的设计
如果user用户表借助了auth模块,就直接import 这张表
在rbac这个APP中:(将管理权限设为一个独立的app(组件)) models.py
from django.db import models # Create your models here. class User(models.Model):
name=models.CharField(max_length=32)
pwd=models.CharField(max_length=32)
roles=models.ManyToManyField("Role")
def __str__(self):
return self.name class Role(models.Model):
title=models.CharField(max_length=32)
permissions=models.ManyToManyField("Permission")
def __str__(self):
return self.title class Permission(models.Model):
title = models.CharField(max_length=32)
url = models.CharField(max_length=32) code=models.CharField(max_length=32,default="list") def __str__(self):
return self.title
由于是基于Xadmin的,所以我们要借助这个后台管理,所以要将这几张模型表注册
在rbac app下的Xadmin.py中注册:
from Xadmin.service.Xadmin import site,ModelXadmin
from .models import User
from .models import Role
from .models import Permission site.register(User)
site.register(Role) class PermisssionConfig(ModelXadmin):
list_display = ["id","title","url","code"] site.register(Permission,PermisssionConfig)
设置中间件,并且将权限列表保存在session中
在rbac下创建一个service的package,然后在新建一个.py文件,用于放置中间件的逻辑。
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect,HttpResponse,render
import re class ValidPermission(MiddlewareMixin): def process_request(self,request): print("path",request.path)
current_path=request.path white_list=["/login/","/reg/","/index/","/admin/*"] for ignore_url in white_list:
ret=re.search(ignore_url,current_path)
if ret:
return None # 校验是否登录 user_id=request.session.get("user_id")
if not user_id:
return redirect("/login/") # 校验是否拥有相应权限 permission_list=request.session.get("permission_list")
print("permission_list",permission_list) for permission in permission_list:
permission="^%s$"%permission
ret=re.search(permission,current_path)
if ret:
return None return HttpResponse("没有访问权限!")
登录成功后,校验通过后,执行取值和给session赋值:(将这个过程封装到一个.py文件中,哪儿需要直接import即可)
def init_session_permission(user,request): permissions = user.roles.all().values("permissions__url","permissions__code","permissions__title").distinct()
print("permissions",permissions)
permission_list = []
menu_permission_dict={}
for permission in permissions:
permission_list.append(permission.get("permissions__url"))
if permission.get("permissions__code")=="list":
menu_permission_dict[permission.get("permissions__title")]=permission.get("permissions__url") request.session["permission_list"] = permission_list
request.session["menu_permission_dict"] = menu_permission_dict
备注:要对筛选的结果进行去重操作。因为一个用户会有多个role。
在用户左侧菜单展示可访问的页面
左侧展示页面:首先一点,我们可以给用户展示权限中的那些url,增删改查中,改删是有动态参数的,无法展示,而添加页面显得有些多余,所以我们可以将所有的权限路径中属于展示的url过滤出来,然后加入左侧菜单栏中,为了方便快捷,我们可以在这个permission权限表中,增加一个字段,叫code,我们可以将增删改查设置为四类,然后在登录成功,设置session值时,对查这个url进行过滤,单独保存在一个session中,然后我们可以在相应页面中直接取值,即可,大大的方便了展示信息的代码冗余和可复用性。具体的HTML页面中,我们可以设置到一个母版中,然后用户就可以在不同的页面直接通过继承就可以实现左侧菜单栏的效果。
具体的HTML的实现:
<div class="menu">
<div class="panel panel-danger">
<div class="panel-heading">Panel heading without title</div>
<div class="panel-body">
{% for title,url in request.session.menu_permission_dict.items %}
<p><a href="{{ url }}">{{ title }}</a></p>
{% endfor %} </div>
</div>
</div>
Django之管理权限的更多相关文章
- Django实现Rbac权限管理
权限管理 权限管理是根据不同的用户有相应的权限功能,通常用到的权限管理理念Rbac. Rbac 基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问, ...
- Django项目实践4 - Django网站管理(后台管理员)
http://blog.csdn.net/pipisorry/article/details/45079751 上篇:Django项目实践3 - Django模型 Introduction 对于某一类 ...
- Django项目实践4 - Django站点管理(后台管理员)
http://blog.csdn.net/pipisorry/article/details/45079751 上篇:Django项目实践3 - Django模型 Introduction 对于某一类 ...
- Django中用户权限模块
Django中用户权限模块 1 auth模块 auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. auth可以和admin模块配合使用, 快速建立网站的管理系 ...
- Django内置权限扩展案例
当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统,Django内置权限系统基于model层做控制,新的model创建后会默认新建 ...
- django 用户管理相关的表
Django 用户管理相关的表: create table django_content_type ( /* 内容类型表 */ id ) not null auto_increment, app_la ...
- django自带权限机制
1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发,理清Django权限机制是 ...
- Django笔记 —— Admin(Django站点管理界面)
最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...
- django后台管理-admin
0922自我总结 django后台管理-admin 一.模型注册 admin.py 注册方式一: #在对于注册的app中的admin文件中导入模型然后注册模型 admin.site.register( ...
随机推荐
- mysql日志配置
mysql在错误排查,优化的时候会用到日志 有错误日志,查询日志,慢查询日志,二进制日志 先找到日志文件,linux 一般在/etc/my.cnf中 打开看到 log-error=/webserver ...
- poj 3764 字典树
The xor-longest Path Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7332 Accepted: 1 ...
- Holm–Bonferroni method
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...
- js知识点乱炖
修改属性 元素.style.样式=值 document.getElementById('box').style.width='200px'; 属性操作方式 1.. 的 元素.属性名如果属性是单 ...
- [DeeplearningAI笔记]序列模型2.7负采样Negative sampling
5.2自然语言处理 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.7 负采样 Negative sampling Mikolov T, Sutskever I, Chen K, et a ...
- [DeeplearningAI笔记]卷积神经网络4.11一维和三维卷积
4.4特殊应用:人脸识别和神经网络风格转换 觉得有用的话,欢迎一起讨论相互学习~Follow Me 4.11一维和三维卷积 二维和一维卷积 对于2D卷积来说,假设原始图像为\(14*14*3\)的三通 ...
- libxml移植到android
libxml是C语言写的xml解析库,是我们开发可移植程序的首选,下面讲述将其移植到android的步骤 1.下载已经配置好的源代码包android_libxml2.rar http://pan.ba ...
- 跟我一起写Makefile(三)
书写规则———— 规则包含两个部分,一个是依赖关系,一个是生成目标的方法. 在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来 ...
- HTML跳转
<!DOCTYPE html><HTML><HEAD> <TITLE> HolyMirror </TITLE> <meta http- ...
- UVA 818 Cutting Chains
https://vjudge.net/problem/UVA-818 题意: 有n个圆环,其中有一些已经扣在了一起.现在需要打开尽量少的圆环,使得所有圆环可以组成一条链 n<=15 因为n< ...