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( ...
随机推荐
- JAVA本地TXT文件解决中文乱码问题
import java.io.*; public class ReadFile { public static void main(String[] args) { try { File file = ...
- 【DP】【P5007】 DDOSvoid 的疑惑
Description 给定一棵以 1 为根的有根树,定义树的一个毒瘤集为一个集合,并且集合中任意两个元素之间不存在祖先与后代关系. 定义一个毒瘤集的毒瘤指数为集合内所有元素的价值之和 要求给定树的所 ...
- mysql四-2:多表查询
一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 准备表 #建表 create table department( id int, name varchar(20) ); create ta ...
- 流媒体协议之JRTPLIB的使用20170919
主要介绍JRTPLIB 2.x系列和3.x系列两种版本,它们的区别是2.x系列代码量少使用简单,但是只支持RFC 1889不支持RFC 3550,3.x支持RFC 3550,但代码量稍多,以及使用也稍 ...
- bzoj 4332: JSOI2012 分零食 快速傅立叶变换
题目: Description 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U.如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是\(f(x)=O*x^2+S*x+U\) 现 ...
- 【题解】【LibreOJ Beta Round #5】游戏 LOJ 531 基环树 博弈论
Prelude 题目链接:萌萌哒传送门♪(^∇^*) Subtask 1 & 2 这是什么鬼题面... 首先要看出,这就是一个基环树博弈. 具体题意:给出一个基环内向树,一个棋子初始在\(1\ ...
- Tensorflow BatchNormalization详解:3_使用tf.layers高级函数来构建带有BatchNormalization的神经网络
Batch Normalization: 使用tf.layers高级函数来构建带有Batch Normalization的神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 吴 ...
- Fiddler 网页采集抓包利器__手机app抓包
用curl技术开发了一个微信文章聚合类产品,把抓取到的数据转换成json格式,并在android端调用json数据接口加以显示: 基于weiphp做了一个掌上头条插件,也是用的网页采集技术:和一个创业 ...
- Tomcat处理一个http请求的过程
假设来自客户的请求为: http://localhost:8080/wsota/wsota_index.jsp 1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Con ...
- Selenium/HtmlUnit设置代理获取JS生成的网页
通常我们使用Java提供的HttpURLConnection或者Apache的HttpClient获取的网页源代码都是直观可见的,其代码的内容和通过浏览器右键网页->点击查看网页源代码的内容一致 ...