权限管理顾名思义,其实就是角色控制权限的系统,每个用户对应一个角色,每个角色有对应的权限,比如公司会有CEO,总监,销售经理,销售员,每个人的权限都不一样,那我们给他展示的url也都不同

一、首先创建项目,再创建一个名为rbac的app

  修改配置文件settings,将css以及js、img等放到static文件夹下

二、表结构设计

 设计表:

  创建五个类,七张表:

  菜单表,权限组,权限表,用户表,角色表,

  角色表和权限表是多对多的关系(一个角色可以有多个权限,一个权限可以对应多个角色)
     用户表和角色表是多对多的关系(一个用户可以有多个角色,一个角色有多个用户)

  

models.py

from django.db import models

# 菜单组
class Menu(models.Model):
title = models.CharField(verbose_name='菜单组', max_length=32) class Meta:
verbose_name_plural = '菜单表' def __str__(self):
return self.title # 权限组
class Group(models.Model):
title = models.CharField(verbose_name='权限标题', max_length=32)
menu = models.ForeignKey(verbose_name='所属菜单', to='Menu', default=1) class Meta:
verbose_name_plural= '权限组表' def __str__(self):
return self.title # 权限表
class Permission(models.Model): title = models.CharField(verbose_name='标题', max_length=128)
url = models.CharField(verbose_name='含正则表达式的URL', max_length=128)
menu_gp = models.ForeignKey(verbose_name='组内权限', to='Permission', null=True, blank=True, related_name='x1')
code = models.CharField(verbose_name='权限代号', max_length=32)
group = models.ForeignKey(verbose_name='所属组', to='Group') class Meta:
verbose_name_plural= '权限表' def __str__(self):
return self.title # 用户表
class UserInfo(models.Model): username = models.CharField(verbose_name='用户名', max_length=32)
password = models.CharField(verbose_name='密码',max_length=64)
user_role = models.ManyToManyField(verbose_name='用户角色', to='Role', blank=True) class Meta:
verbose_name_plural= '用户表' def __str__(self):
return self.username # 角色表
class Role(models.Model): position = models.CharField(verbose_name='职位', max_length=32)
permissions = models.ManyToManyField(verbose_name='角色权限', to='Permission', blank=True) class Meta:
verbose_name_plural= '角色表' def __str__(self):
return self.position

我们一般是先看到的是列表页面,在这个页面上是否显示添加,是否显示编辑,是否显示删除,都是需要判断的, 有无添加权限,有无删除权限,有无编辑权限,我们可以给每一个url一个代号,将代号取出来放在一个列表里面

dict = {
'5': {
'codes': ['list', 'add', 'edit', 'del'],
'urls': ['/userinfo/', '/userinfo/add/', '/userinfo/(\\d+)/change/', '/userinfo/(\\d+)/delete/']
},
'1': {
'codes': ['list', 'add', 'edit', 'del'],
'urls': ['/order/', '/order/add/', '/order/(\\d+)/change/', '/order/(\\d+)/delete/']
}
}

把这个字典存到session中当你访问页面的时候我就知道你有什么权限一个url对应一个code 多个url对应一个组.

三、通过Django-admin录入数据

先创建一个超级用户:python3 manage.py createsuperuser
用户名:root
密码:a123456

在admin.py中做如下配置:

from django.contrib import admin
from . import models admin.site.register(models.Menu)
admin.site.register(models.UserInfo)
admin.site.register(models.Role)
admin.site.register(models.Permission)
admin.site.register(models.Group)

 

models.py中做如下配置,就可以在添加的时候显示中文了。

# 菜单组
class Menu(models.Model):
title = models.CharField(verbose_name='菜单组', max_length=32) class Meta:
verbose_name_plural = '菜单表' def __str__(self):
return self.title

  

 

四、编写登录

  利用Django的中间件进行控制,没有登录的用户不能直接访问内部的url,而且只能访问admin,login,index这三个url,将其设置为白名单,用户登录成功后,将用户信息方法哦session里边,进行权限访问时去session里边读取,如果有的话进行url跳转,如果没有的话返回‘’无权访问‘’

  1.在settings内设置白名单:

    

  2.编写中间件控制时,必须继承MiddlewareMixin这个类

  

# -*- coding:utf-8 -*-
# !/usr/bin/python
from django.shortcuts import redirect, HttpResponse
from django.conf import settings
import re class MiddlewareMixin(object): def __init__(self, get_response=None):
self.get_response = get_response
super(MiddlewareMixin, self).__init__() def __call__(self, request):
response = None
if hasattr(self, 'process_request'):
response = self.process_request(request)
if not response:
response = self.get_response(request)
if hasattr(self, 'process_response'):
response = self.process_response(request, response)
return response class RbacMiddleware(MiddlewareMixin): def process_request(self, request): # 1.当前请求的URL
current_request_url = request.path_info # 2.处理白名单
for url in settings.VALID_URL_LIST:
if re.match(url, current_request_url):
return None # 3.获取session中保存的权限信息
permission_dict = request.session.get(settings.XX)
print(permission_dict)
if not permission_dict:
return redirect(settings.RBAC_LOGIN_URL)
flag = False
for group_id, values in permission_dict.items():
for url in values["urls"]:
if re.match(url, current_request_url):
flag = True
break
if flag:
break
if not flag:
return HttpResponse("无权访问")

  

Django权限管理系统设计分析的更多相关文章

  1. [Python学习] Django 权限控制

    本文为大家讲解 Django 框架里自带的权限模型,从理论到实战演练,带领大家了解 Django 里权限是怎么一回事. 一.主要内容 1.什么是权限管理? 2.Web 权限 3.Django 权限机制 ...

  2. RBAC权限管理系统

    RBAC--基于角色的权限管理系统 优势: 1. 简化了用户和权限的关系 2. 易扩展,易于维护 3. RBAC不用给用户单个分配权限,只用指向对应的角色就会有对应的权限,而且分配权限和收回权限都很方 ...

  3. Django权限auth模块详解

    转自:http://www.cnblogs.com/Finley/p/5575305.html 1,auth模块是Django提供的标准权限管理系统,可以提供用户身份认证,用户组和权限管理 2,aut ...

  4. Django权限系统auth

    auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. auth可以和admin模块配合使用, 快速建立网站的管理系统. 在INSTALLED_APPS中添加'd ...

  5. Django权限系统auth模块详解

    转自:原文出处 auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. auth可以和admin模块配合使用, 快速建立网站的管理系统. 在INSTALLED_A ...

  6. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  7. Asp.Net Core 项目实战之权限管理系统(0) 无中生有

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  8. Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  9. Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

随机推荐

  1. Google pieCharts的学习

    在公司项目开发过程中, 尤其是在网站的开发过程中,用到很多的前端的插件,在这里, 我简单介绍下近期Google pieCharts的是使用方法 https://developers.google.co ...

  2. pc-要实现相隔一定时间数据排序变化一次

    有时候产品会有这种要求,就是展示的数据三天是正序的,一天是逆序的,解决是: 以某一个时间点为基准点,然后获取当前的时间,然后计算差值,分情况 //专利 JPView : function(Sorder ...

  3. hihocoder 1093 SPFA算法

    题目链接:http://hihocoder.com/problemset/problem/1093 , 最短路的SPFA算法. 由于点的限制(10w),只能用邻接表.今天也学了一种邻接表的写法,感觉挺 ...

  4. UOJ#126【NOI2013】快餐店

    [NOI2013]快餐店 链接:http://uoj.ac/problem/126 YY了一个线段树+类旋转卡壳的算法.骗了55分.还比不上$O(n^2)$暴力T^T 题目实际上是要找一条链的两个端点 ...

  5. linux 命令——33 df(转)

    linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式: df [选项] [文件] 2.命 ...

  6. IOS DatePicker 和 UIBarButtonItem 常用属性

    - (void)viewDidLoad { [super viewDidLoad]; // // self.inputTextField.inputView = [[UISwitch alloc ] ...

  7. 【洛谷4657】[CEOI2017] Chase(一个玄学的树形DP)

    点此看题面 大致题意: 有一棵树,树上编号为\(i\)的节点上有\(F_i\)个铁球,逃亡者有\(V\)个磁铁,当他在某个节点放下磁铁时,与这个节点相邻的所有节点上的铁球都会被吸引到这个节点.然后一个 ...

  8. python_20_列表

    #1 names=["QiZhiguang","DaiYang","HuZhongtao","ZhangDong"] p ...

  9. 【转】CentOS 7.0 安装Redis 3.2.1详细过程和使用常见问题

    http://www.linuxidc.com/Linux/2016-09/135071.htm 环境:CentOS 7.0 Redis 3.2.1 Redis的安装与启动 这里我把Redis放在/h ...

  10. 解决centos7 nslookup:command not found

    解析域名www.google.com时,报错,命令找不到,是因为新安装的centos7,没有安装bind-utils,安装后就可以运行nslookup了