Django - 权限(1)
一、权限表结构设计
1、认识权限
生活中处处有权限,比如,腾讯视频开会员才有观看某个最新电影的权限,你有房间钥匙就有了进入这个房间的权限,等等。同样,程序开发过程中也有权限,我们今天说的权限指的是web网站权限,对于不同用户访问web服务时应该有不同的功能,如,一个公司有CEO、销售主管、销售等等,不同的用户能访问的服务也不是完全相同的,所以这个时候就需要权限控制了。
2、为什么要开发权限组件
组件可以减少重复开发,一次开发,在以后的项目中可以一直使用,避免重复写同样的代码。
3、web开发中权限是指什么?
web程序是通过 url 的切换来查看不同的页面(功能),所以权限指的其实就是一个含有正则表达式的URL,对url控制就是对权限的控制。
结论:一个人有多少个权限就取决于他有多少个URL的访问权限。
4、权限表结构设计(简单版)
根据实际情况,一般一个用户可以有多个权限,一个权限也可以分配给多个用户,所以表结构可以按照如下设计:
用户表 权限表
id name id user_id url title
1 alex 1 1 /customer/add 添加客户
2 egon 2 1 /customers/list/ 查看客户
3 1 /consult_records/add/ 添加跟进记录
4 1 /consult_records/ 查看跟进记录
分析:设计完之后思考一下这样做有什么问题?假设又新增了10个用户,每个用户都有右表中的4个权限,那就要在权限表中新增40条记录,这还是只有4个url的情况,现实生活中一个web网站肯定不止4个url,这意味着每增加一个用户,你就要在权限表中增加若干条记录,加重了程序员的工作不说,这样造成了数据库空间的严重浪费,那么思考一下如何改进!
5、权限表设计(第二版)
聪明的你一定有想法了,没错,如果对用户进行划分角色,然后对角色进行权限的分配,问题就解决了。
分析:
一个人可以有多个角色
一个角色可以有多个人
一个角色可以有多个权限
一个权限可以分配给多个角色
表结构设计:
用户表:user user2role表
id name id user_id role_id
1 alex 1 1 3
2 egon 2 2 3 角色表:role role2permission
id title id role_id permission_id
1 CEO 1 3 1
2 销售总监 2 3 2
3 销售 3 3 3
4 3 4
权限表:permission
id url title
1 /customer/add 添加客户
2 /customers/list/ 查看客户
3 /consult_records/add/ 添加跟进记录
4 /consult_records/ 查看跟进记录
经过调整之后,由原来的【基于用户的权限控制】转换成【基于角色的权限控制】,以后再进行分配权限时只需要给指定角色分配一次权限,给众多用户再次分配指定角色即可。
models.py中代码如下:
from django.db import models # Create your models here.
class User(models.Model):
"""
用户表
"""
name = models.CharField(verbose_name='用户名', max_length=32)
password = models.CharField(verbose_name='密码', max_length=32)
roles = models.ManyToManyField(verbose_name='拥有的所有角色', to='Role')
def __str__(self):
return self.name class Role(models.Model):
"""
角色表
"""
title = models.CharField(verbose_name='角色名称', max_length=32)
permissions = models.ManyToManyField(verbose_name='拥有的所有权限', to='Permission')
def __str__(self):
return self.title class Permission(models.Model):
"""
权限表
"""
url = models.CharField(verbose_name='含正则的URL', max_length=32)
title = models.CharField(verbose_name='标题', max_length=32) def __str__(self):
return self.title
不经意间,我们居然设计出了一个经典的权限访问控制系统:rbac(Role-Based Access Control)基于角色的权限访问控制。
注意:现在的设计还不是最终版,但之后的设计都是在此版本基础上扩增的,为了能够更好的理解,我们暂且在此基础上继续开发,直到遇到无法满足的情况,再进行整改。
二、客户管理之权限控制
1、首先按照上面model示例代码建表,进行数据库迁移,在admin.py中注册表,然后再创建一个超级用户,登录admin录入数据,如下:





2、修改admin的显示格式,以permission表为例:
在admin.py中,permission表的注册方法admin.site.register(Permission)改为如下代码:
# 自定义类,类名自己定,但必须继承ModelAdmin
class PermissionConfig(admin.ModelAdmin):
list_display = ['pk', 'title', 'url']
ordering = ['pk'] # 按照主键从低到高
admin.site.register(Permission, PermissionConfig)
Permission表显示效果如下,有没有更直观:

注意:使用django的admin添加数据时,一定要记得在admin.py中注册你自己的表,否则登录admin只能看见django自带的表,看不见你自己在model中定义的表。
3、登录视图函数
def login(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd')
user_obj = User.objects.filter(name=user, password=pwd).first()
if user_obj:
request.session['user_id'] = user_obj.pk # 将用户id注入session
# 查询当前登录人的所有权限列表
ret = Role.objects.filter(user=user_obj).values('permissions__url').distinct() permission_list = []
for item in ret:
permission_list.append(item['permissions__url'])
print('权限列表', permission_list)
# 将当前登录人的权限列表注入session中
request.session['permission_list'] = permission_list return HttpResponse('登录成功') return render(request, 'login.html')
4、控制权限的中间件
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect, HttpResponse
import re class PermissionMiddleWare(MiddlewareMixin):
def process_request(self, request): # 设置白名单放行
for reg in ["/login/", "/admin/*"]:
ret = re.search(reg, request.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')
for reg in permission_list:
reg = '^%s$' % reg
ret = re.search(reg, request.path)
if ret:
return None
return HttpResponse('无权访问')
三、补充
1、django的配置文件相关
django中其实有两个配置文件,一个是我们项目中可以看见的settings.py文件,也就是用户的配置文件,另一个是django默认的配置文件global_settings.py,你有没有注意到虽然有些参数我们在自己的配置文件settings.py中虽然没有定义,但其实他是有值的,没错,django是在默认的配置文件中为我们写好了,同时允许我们在自己的setting.py中重新定义覆盖掉django默认值,由此得出用户的配置文件优先级比django默认的高,因此,我们知道了项目的配置参数由django和我们自己定义的配置文件共同决定的,且django的默认配置文件包含我们自己定义的配置文件,所以,当我们导入配置文件时,应以如下方式:
from django.conf import settings
Django - 权限(1)的更多相关文章
- django权限控制
django 权限机制的实现: http://blog.igevin.info/posts/django-permission/
- [Python学习] Django 权限控制
本文为大家讲解 Django 框架里自带的权限模型,从理论到实战演练,带领大家了解 Django 里权限是怎么一回事. 一.主要内容 1.什么是权限管理? 2.Web 权限 3.Django 权限机制 ...
- Django权限机制的实现
Django权限机制的实现 1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发 ...
- django权限管理(Permission)
什么是权限管理 权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自 己被授权的资源 权限管理好比如钥匙,有了钥匙就能把门打开,但是权限设置是有级别之分的,假如这个 系统有多 ...
- django权限之二级菜单
遗漏知识点 1.构建表结构时,谁被关联谁就是主表,在层级删除的时候,删除子表的时候,主表不会被删除,反之删除主表的话,字表也会被删除, 使用related_name=None 反向查询,起名用的 ...
- 一.8.django权限管理/drf权限管理
1.什么是权限管理: .权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源 .权限管理好比如钥匙,有了钥匙就能把门打开,但是权限设置是有级别之分的,假如这个系 ...
- Django 权限管理
对于Django而言,虽然自带了一些基本的通用权限限制,但现实中,可能我们更希望自己去定义业务权限划分 Django对于权限这块的部分验证方法 user = request.user user.is_ ...
- 【Python】django权限管理
参考:http://www.cnblogs.com/esperyong/ 参考:https://docs.djangoproject.com/en/1.8/topics/auth/default/#t ...
- Django权限管理测试
测试内容:当我单击登录页面登录的时候页面会弹出当前用户的个人信息 当我点击提交的时候可以看到我当前用户的所有权限: 测试成功,接下来看一下后台的简单代码: class User(models.Mode ...
- django(权限、认证)系统——第三方组件实现Object级别权限控制
在我的系列blog<Django中内置的权限控制>中明确提及到,Django默认并没有提供对Object级别的权限控制,而只是在架构上留了口子.在这篇blog中,我们探讨一个简单流行的Dj ...
随机推荐
- AES_CBC_PKCS5Padding 加密
在项目中需要对一些关键信息进行传输,但又不能是明文,所以采用此种方式进行加密,另一端再进行解密. AES: 算法 CBC: 模式 使用CBC模式,需要一个向量iv,可增加加密算法的强度 PKCS5 ...
- Linux之手动设置IP地址
一.引言 有时候我们装好了机器却发现网络没有设置,而服务器的机器一般都是没有界面的,那么该如何设置IP呢? 二.步骤 root用户,#vi /etc/sysconfig/network-scripts ...
- 【持续更新】总结:C++开发时积累的一些零碎的东西
Makefile template update: 1.调整了顺序,把经常编辑的部分集中在了Makefile的下半部分 2.进行了一些重构实现更多的代码复用,见红色高亮部分,LIBPATH_ALL和L ...
- 使用Data URL将图片嵌入到网页中
早些时候,使用IE6浏览器,网页可以另存为mht,如果网页包含图片,那么图片也会存储到mht中. mht是微软提供的一种聚合HTML文档,它的本质其实是一个文本文件,那么我们也许会好奇,它的图片存储到 ...
- 真正解决 Android Studio无法启动,gradle下载不了 提示“building “ 项目名”gradle project info”(原创20131216)
最近开始研究Android Studio 开发,但是在开始的时候,一直下载gradle,弄了四天,都没有成功,什么FQ,什么设置gradle路径,都没有解决,但是有一次在公司的电脑上很成功的更新了,完 ...
- jdk与jre的区别(转)
很多程序员已经干了一段时间java了依然不明白jdk与jre的区别.JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境. ...
- 补图BFS(hdu 5876)
题目大意: 给出一个图和起点S,求补图中S到其他点的最短距离. http://acm.hdu.edu.cn/showproblem.php?pid=5876 我自己的垃圾做法: 用线段树来维护dijk ...
- 【BZOJ】2017: [Usaco2009 Nov]硬币游戏(dp+神题+博弈论)
http://www.lydsy.com/JudgeOnline/problem.php?id=2017 这题太神了,我想了一个中午啊 原来是看错题一直没理解题解说的,一直以为题解是错的QAQ “开始 ...
- @classmethod装饰器
当一个类中有多条用例,我们在执行的时候每执行一条用例就要重新打开一次浏览器操作,例如下: start test1 quit start test2 start 若我们使用@classmethod装饰器 ...
- Mybatis 二级缓存脏读
脏读的产生 Mybatis的二级缓存是和命名空间绑定的,所以通常情况下每一个Mapper映射文件都有自己的二级缓存,不同的mapper的二级缓存互不影响.这样的设计一不注意就会引起脏读,从而导致数据一 ...