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( ...
随机推荐
- HDU3507 print article【斜率优化dp】
打印文章 时间限制:9000/3000 MS(Java / Others)内存限制:131072/65536 K(Java / Others) 总共提交:14521已接受提交:4531 问题描述 零有 ...
- spark(二)
一.spark的提交模式 --master(standalone\YRAN\mesos) standalone:-client -cluster 如果我们用client模式去提交程序,我们在哪个地方 ...
- C++之正则表达式20171121
准确来说,不论在C++或C中,只要在Linux系统中都可以使用本文讲诉的正则表达式使用方式. 一.Linux中正则表达式的使用步骤: 编译正则表达式 regcomp() 匹配正则表达式 regexec ...
- 《剑指offer》— JavaScript(7)斐波那契数列
斐波那契数列 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 实现代码 function Fibonacci(n) { var arr = ...
- jsp 的 3 个编译指令
JSP 的编译指令是通知 JSP 引擎的消息,它不直接生成输出. 常见的编译指令有如下三个: 1.page:该指令是针对当前页面的指令 2.include:用于指定包含另一个页面 3.taglib:用 ...
- jdk的keystore生成
使用jdk路径下的keytool.exe生成 生成证书: 导出证书,此时输入生成证书时设置的密码:
- --BEA官方网站(http: //www.bea.com)甲骨文已完成对该公司的收购BEA Weblogic Server 7.0x应用服务器简明安 装、配置手册 1
====================简 介: BEA公司是业内著名的中间件产商,以Tuxedo及Weblogic闻名于世,而其基础件平台(infrastructure)Weblogic platf ...
- Unicode/UTF-8/GBK/ASCII 编码简介
转载:http://blog.csdn.net/u014785687/article/details/73928167 一.字符编码简介 1.ASCII编码 每一个ASCII码与一个8位(bit)二进 ...
- jQuery.fill 数据填充插件
博客园的伙伴们,大家好,I'm here,前段时间特别的忙,只有零星分散的时间碎片,有时仰望天空,有时发呆,有时写代码,正如下面给大家介绍的这个jQuery.fill插件,正是在这样的状态下写出来的. ...
- 关于jQuery UI 使用心得及技巧
1 jQuery UI 有时你仅仅是为了实现一个渐变的动画效果而不得不把javascrip 重新学习一遍然后书写大量代码.直到jQuery的出现,让开发人员从一大堆繁琐的js代码中解脱,取而代之几行j ...