权限:权限就是一个包含正则的url。

Rbac 权限管理:

  Role-Based Access Control,基于角色的访问控制。用户通过角色与权限进行关联,一个用户可以有多个角色,一个角色可以有多个权限。

构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。

(rbac模式-role based access control):
User
id name age
alex
egon
peiqi Role
id title
销售
CEO
销售总监 UserInfo2Role
id user_id role_id permissison id title url
查看客户 /stark/crm/customer/
添加客户 /stark/crm/customer/add
查看订单 /stark/crm/order/
添加订单 /stark/crm/order/add Role2permissison id role_id permissison_id

在权限app :rbac    model表中:

from django.db import models

# Create your models here.
class User(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=32)
roles = models.ManyToManyField('Role') def __str__(self):
return self.name class Role(models.Model): name = models.CharField(max_length=32)
permissions= models.ManyToManyField("Permission")
def __str__(self):
return self.name class Permission(models.Model): title = models.CharField(max_length=32)
url = models.CharField(max_length=128) def __str__(self):
return self.title

权限录入

在另一个app : app1 model.py 中 创建两条表记录:(可以对customer 和 Order 表进行权限管理 ,对可以进行 增删改查操作权限设置。

from django.db import models

# Create your models here.

class Customer(models.Model):
name = models.CharField(max_length=32,verbose_name="客户姓名") def __str__(self):
return self.name class Order(models.Model): order_id = models.CharField(max_length=32)
def __str__(self):
return self.order_id

1.进行数据的迁移,  执行:

  python manage.py  makemigrations

  python manage.py   migrate

2.引入stark组件

3. 给 权限表  设计权限  url 

项目视图views 登录视图

from django.shortcuts import render,HttpResponse,redirect
from rbac.service.permissions import permission_init
# Create your views here.
from rbac.models import User
def login(request): if request.method=="GET": return render(request,"login.html")
else:
user = request.POST.get("user")
password = request.POST.get("password")
user_obj = User.objects.filter(name=user,password=password).first() if user_obj: #登录成功后:
request.session["user_id"] = user_obj.pk
# 获取登录用户的所有权限
role_queryset = user_obj.roles.all().values("permissions__url")
permission_list = []
for dic in role_queryset:
# 把所有权限加到权限列表中
permission_list.append(dic["permissions__url"])
request.session["permission_list"] = permission_list #通过调用权限文件的方法 #权限列表 注入 session request.session ["permission_list"] = permission_list
permission_init(request,user_obj)
else:
return redirect("/login/") return redirect("/index/") def index(request): return render(request,"index.html")

创建 访问权限的中间键:

from django.utils.deprecation import MiddlewareMixin

from django.shortcuts import HttpResponse,render,redirect
import re
class PermissionMiddleWare(MiddlewareMixin): def process_request(self,request): #查看当前的请求路径
current_path = request.path #1 放行白名单
white_list = ["/login/","/admin*/",]
for reg in white_list:
if re.search(reg,current_path):
return None #放行
#2 判断是否登录
if not request.session.get("user_id"):
return redirect("/login/") #3 权限校正
#获取当前用户的权限列表
permission_list = request.session.get("permission_list")
#正则匹配
for reg_path in permission_list:
reg_path = "^%s$"%reg_path
if re.search(reg_path,current_path):
return None
return HttpResponse("您没有访问权限!")

权限app: rbac 相关文件安置:

在项目的settings.py 中配置该中间键:

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'rbac.service.middleware.PermissionMiddleWare',
]

django权限管理(一)的更多相关文章

  1. 【Python】django权限管理

    参考:http://www.cnblogs.com/esperyong/ 参考:https://docs.djangoproject.com/en/1.8/topics/auth/default/#t ...

  2. Django 权限管理(二)

    权限菜单展示 1.展示的效果 实现该效果,涉及到的核心点(突破点) 1. 权限分类: (1)菜单权限 (主要用来展示的权限(url)如查看权限 url,  如上图中的每个权限都归类为菜单权限,主要用来 ...

  3. 一.8.django权限管理/drf权限管理

    1.什么是权限管理: .权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源 .权限管理好比如钥匙,有了钥匙就能把门打开,但是权限设置是有级别之分的,假如这个系 ...

  4. Django 权限管理

    对于Django而言,虽然自带了一些基本的通用权限限制,但现实中,可能我们更希望自己去定义业务权限划分 Django对于权限这块的部分验证方法 user = request.user user.is_ ...

  5. Django权限管理测试

    测试内容:当我单击登录页面登录的时候页面会弹出当前用户的个人信息 当我点击提交的时候可以看到我当前用户的所有权限: 测试成功,接下来看一下后台的简单代码: class User(models.Mode ...

  6. django权限管理

    当我们为应用创建一个Models, 在同步到数据库里,django默认给了三个权限 ,就是 add, change, delete权限. 首先,我们创建一个perm_test的project, 然后再 ...

  7. Django之权限管理

    Django权限管理之初步完整版 项目背景:这是一个权限管理系统(给一些角色和他们的权限指URL和页面可以删除的按钮比如:增删改查) 使用到了中间件,和初始化权限,使用了admin的后台管理系统. 我 ...

  8. [Django]用户权限学习系列之权限管理界面实现

    本系列前三章: http://www.cnblogs.com/CQ-LQJ/p/5604331.htmlPermission权限基本操作指令 http://www.cnblogs.com/CQ-LQJ ...

  9. [Django]用户权限学习系列之设计自有权限管理系统设计思路

    若在阅读本片文章遇到权限操作问题,请查看本系列的前两章! http://www.cnblogs.com/CQ-LQJ/p/5609690.html和http://www.cnblogs.com/CQ- ...

随机推荐

  1. bzoj2152: 聪聪可可 点分治

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2152 luogu爆搜都能过,总时间超过100ms就是写错了 思路 直接mod上面跑点分治就行 ...

  2. bzoj 1251: 序列终结者 平衡树,fhqtreap

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1251 思路 好简单的模板题 不过还是wrong了好几发 叶子节点要注意下,不能使用 遇到就不 ...

  3. 【Dalston】【第五章】API服务网关(Zuul) 上

    微服务场景下,每一个微服务对外暴露了一组细粒度的服务.客户端的请求可能会涉及到一串的服务调用,如果将这些微服务都暴露给客户端,那么客户端需要多次请求不同的微服务才能完成一次业务处理,增加客户端的代码复 ...

  4. SQLite EF Core Database Provider

    原文链接 This database provider allows Entity Framework Core to be used with SQLite. The provider is mai ...

  5. 转载:mysql存储过程讲解

    记录MYSQL存储过程中的关键语法: DELIMITER // 声明语句结束符,用于区分; CEATE PROCEDURE demo_in_parameter(IN p_in int) 声明存储过程 ...

  6. 测试常用的Linux命令总结

    列出常用的命令和最常用的用法,排名不分先后:) 1. find在/home目录下查找以.txt结尾的文件名find /home -name "*.txt"同上,但忽略大小写find ...

  7. 【NOIP 2017】Day2 T3 列队

    Problem Description \(Sylvia\) 是一个热爱学习的女孩子. 前段时间,\(Sylvia\) 参加了学校的军训.众所周知,军训的时候需要站方阵. \(Sylvia\) 所在的 ...

  8. 使用explain来分析SQL语句实现优化SQL语句

    用法:explain sql 作用:用于分析sql语句 mysql> explain select * from quser_1 where loginemail = "quctest ...

  9. Java单例设计模式(实现Java的一个类只有一个对象)

    单例设计模式的定义:单例设计模式是一种软件设计模式,在它的核心包含一个称为单例类的核心类. 核心便是希望一个类只有一个对象.  如何实现类在内存中只有一个对象呢? 第一步:构造私有:第二步:本身提供一 ...

  10. 当面试官问你GET和POST区别的时候,请这么回答.......

    文章内容转载于微信公众号WebTechGarden 一.GET和POST的'普通'区别 GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就 ...