一、rbac

权限组件
1 项目与应用
一个项目,可以有多个应用
一个应用,可以在多个项目下
前提:应用是组件!! 2 什么是权限?
一个包含正则表达式url就是一个权限 who what how ---------->True or Flase UserInfor
id
name
pwd
permission=models.manytomany(Permission) 多对多 id name pwd
1 egon 123
2 alex 456
3 A 111
4 B 222
5 C 333
6 D 444 Permission
id
url=.....
title=.... id url title
1 "/users/" "查看用户"
2 "/users/add/" "添加用户"
3 "/customer/add" "添加客户" UserInfor_permission id
user_id
permission_id id user_id permission_id
1 1 1
2 1 2
3 2 2 4 3 1
5 3 2
6 3 3 7 4 1
8 4 2
9 4 3 10 5 1
11 5 2
12 5 3 13 6 1
14 6 2
15 6 3 16 7 1
17 7 2
18 7 3 示例:登录人:egon
访问url:http://127.0.0.1:8000/users/ def users(request):
user_id=request.session.get("user_id") obj=UserInfor.objects.filter(pk=user_id).first()
obj.permission.all().valuelist("url") # 基于对象的跨表查询 return HttpResponse("users.....") 这样做 是否 有问题?
假设:10人 。。。 应该,不同的角色有不同的权限! 不要给人定权限,
应该给角色定权限
rbac 正确的 见 版本2
------------------------------------------------------------ # 版本2: UserInfor
id
name
pwd
roles = manytomany() 多对多 name pwd
egon 123
alex 456
alex 456
alex 456 Role
id
title=.......
permissions = manytomany() 多对多 id title
1 销售员 UserInfor2Role id user_id role_id
1 1 1 Permission
id
url=.....
title=.... id url title
1 "/users/" "查看用户"
2 "/users/add/" "添加用户"
3 "/customer/add" "添加客户" Role2Permission id role_id permission_id
1 1 1
2 1 2
3 1 3 rbac(role-based access control) app01 做的是项目相关的逻辑内容
rbac 制作权限相关的内容 关于rbac: # 要把他它成组件 (1) 创建表关系:
class User(models.Model):
name=models.CharField(max_length=32)
pwd=models.CharField(max_length=32)
roles=models.ManyToManyField(to="Role") def __str__(self): return self.name class Role(models.Model):
title=models.CharField(max_length=32)
permissions=models.ManyToManyField(to="Permission") def __str__(self): return self.title class Permission(models.Model):
title=models.CharField(max_length=32)
url=models.CharField(max_length=32) def __str__(self):return self.title (2) 基于admin录入数据 (3) 登录校验: if 登录成功: 查询当前登录用户的权列表注册到session中 (4) 校验权限(中间件的应用)
class ValidPermission(MiddlewareMixin): def process_request(self,request): # 当前访问路径
current_path = request.path_info # 检查是否属于白名单
valid_url_list=["/login/","/reg/","/admin/.*"] for valid_url in valid_url_list:
ret=re.match(valid_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",[]) # ['/users/', '/users/add', '/users/delete/(\\d+)', 'users/edit/(\\d+)'] flag = False
for permission in permission_list: permission = "^%s$" % permission ret = re.match(permission, current_path)
if ret:
flag = True
break
if not flag:
return HttpResponse("没有访问权限!") return None

笔记

rbac(role-based access control)

基于角色的权限访问控制

二、数据库

1.新建一个应用:
startapp rbac INSTALLED_APPS = [
...
'app01.apps.App01Config',
'rbac.apps.RbacConfig',
] makemigrations
migrate

models.py

from django.db import models

class User(models.Model):
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
roles = models.ManyToManyField(to='Role') def __str__(self):
return self.name class Role(models.Model):
title = models.CharField(max_length=32)
permission = models.ManyToManyField(to='Permission') def __str__(self):
return self.title class Permission(models.Model):
title = models.CharField(max_length=32)
url = models.CharField(max_length=32) def __str__(self):
return self.title

三、admin

1.前提
createsuperuser
(yuan yuan1234)

admin.py

from django.contrib import admin

# Register your models here.

from .models import *

admin.site.register(User)
admin.site.register(Role)
admin.site.register(Permission)

四、登录验证 (session permission_list)

1.在session中注册用户ID
request.session['user_id'] = user.pk 2.初始化 permission_list 并注册到session 中
initial_session(user,request) rbac/service/permission.py
def initial_session(user, request):
permission = user.roles.all().values('permission__url').distinct() # print(permission)
# 去重后的 所有权限!! 将权限 存在 session 中!!
# <QuerySet [{'permission__url': '/users/'}, {'permission__url': '/users/add'}]> permission_list = []
for item in permission:
permission_list.append(item['permission__url']) print(permission_list)
# ['/users/', '/users/add'] request.session['permission_list'] = permission_list

注意点:

permission = user.roles.all().values('permission__url').distinct()
1.values:      
temp = []
for role in user.roles.all(): # < QuerySet[ < Role: 保洁 >, < Role: 销售 >] >
temp.append({
'title':role.title
'permission__url': role.permission__url.all()
})
return temp 2.values 不会去重!!
<QuerySet [{'title': '保洁', 'permission__url': '/users/'},
{'title': '销售', 'permission__url': '/users/'},
{'title': '销售', 'permission__url': '/users/add'}]> views.py
def login(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd') user = User.objects.filter(name=user,pwd=pwd).first()
if user:
# 在session中注册用户ID
request.session['user_id'] = user.pk # 初始化 permission_list 并注册到session 中
initial_session(user,request) return HttpResponse('登录成功') return render(request,'login.html')

五、基于中间件的权限校验

MIDDLEWARE = [
...
'django.middleware.csrf.CsrfViewMiddleware',
...
'rbac.service.rbac.ValidPermission',
]

注意点:

1.白名单,不需要任何权限的url
valid_url_list = ['/login/', '/reg/', '/admin/.*']
for valid_url in valid_url_list:
ret = re.match(valid_url, current_path)
if ret:
return 正则匹配 2.校验是否登录,
user_id = request.session.get('user_id')
if not user_id:
return redirect('/login/') 3.校验权限(^ $ / 正则)
permission_list = request.session.get('permission_list',[]) flag = False
for permission in permission_list:
# ['/users/', '/users/add/', '/users/edit/(\\d+)/', '/users/delete/(\\d+)/']
# 需要 ^ $ 限定!!
permission = "^%s$" % permission # 正则
ret = re.match(permission, current_path)
if ret:
flag = True
break if not flag:
return HttpResponse('无访问权限!')

rbac/service/rbac.py
# -*- coding:utf-8 -*-
from django.shortcuts import HttpResponse, render, redirect
from django.utils.deprecation import MiddlewareMixin
import re class ValidPermission(MiddlewareMixin): def process_request(self,request): current_path = request.path_info # 白名单,不需要任何权限的url
valid_url_list = ['/login/', '/reg/', '/admin/.*'] for valid_url in valid_url_list:
ret = re.match(valid_url, current_path)
if ret:
return # 校验是否登录
user_id = request.session.get('user_id')
if not user_id:
return redirect('/login/') # 校验权限
permission_list = request.session.get('permission_list',[]) flag = False
for permission in permission_list:
# ['/users/', '/users/add/', '/users/edit/(\\d+)/', '/users/delete/(\\d+)/']
# 需要 ^ $ 限定!!
permission = "^%s$" % permission ret = re.match(permission, current_path)
if ret:
flag = True
break if not flag:
return HttpResponse('无访问权限!')

rbac - 初识的更多相关文章

  1. Django - 学习目录

    Django 基础 web应用/http协议/web框架 Django简介 Django - 路由层(URLconf) Django - 视图层 Django - 模板层 Django - 模型层 - ...

  2. 1、rbac权限组件-初识, 中间件校验1

    1.权限组件rbac 1.什么是权限 1 项目与应用 2 什么是权限? 一个包含正则表达式url就是一个权限 who what how ---------->True or Flase 2.版本 ...

  3. 初识rbac

    一.权限组件 1.项目与应用 一个项目可以有多个应用:一个应用可以在多个项目下:前提:应用是组件. 2.什么是权限? 一个包含正则表达式的url就是一个权限. 可以理解为如下方程式: who what ...

  4. rbac权限+中间件 初识

    rbac权限+中间件 1.权限组件rbac 1.什么是权限 1 项目与应用 2 什么是权限? 一个包含正则表达式url就是一个权限 who what how ---------->True or ...

  5. django自定义rbac权限组件(二级菜单)

    一.目录结构 二.表结构设计 model.py from django.db import models # Create your models here. class Menu(models.Mo ...

  6. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

  7. 初识Hadoop

    第一部分:              初识Hadoop 一.             谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...

  8. python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)

    一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...

  9. yii2的权限管理系统RBAC简单介绍

    这里有几个概念 权限: 指用户是否可以执行哪些操作,如:编辑.发布.查看回帖 角色 比如:VIP用户组, 高级会员组,中级会员组,初级会员组 VIP用户组:发帖.回帖.删帖.浏览权限 高级会员组:发帖 ...

随机推荐

  1. Linux下密码抓取神器mimipenguin

    前有Mimikatz,今有mimipenguin,近日国外安全研究员huntergregal发布了工具mimipenguin,一款Linux下的密码抓取神器,可以说弥补了Linux下密码抓取的空缺. ...

  2. URAL 1203 Scientific Conference(贪心 || DP)

    Scientific Conference 之前一直在刷计算几何,邀请赛连计算几何的毛都买见着,暑假这一段时间就做多校.补多校的题目.刷一下一直薄弱的DP.多校假设有计算几何一定要干掉-.- 题意:给 ...

  3. linux 删除文件夹及其内容,显示文件路径

    比如要删除work文件夹包括里面的内容,则:rm -r /home/ftk/apache-tomcat-5.5.20/work,不管它是文件还是目录都删掉了 知道文件名 要查询文件大概地址用~cd ~ ...

  4. SQL中查询语句的使用

    常用SQL查询语句 - myLittleGarden - 博客园 http://www.cnblogs.com/sunada2005/p/3411873.html 一.简单查询语句 1. 查看表结构 ...

  5. linux中,通过crontab -e编辑生成的定时任务,写在哪个文件中

    环境描述: 操作系统:Red Hat Enterprise Linux Server release 6.6 (Santiago) 内核版本:2.6.32-504.el6.x86_64 需求描述: 一 ...

  6. java.util.logging.Logger使用具体解释

    java.util.logging.Logger不是什么新奇东西了,1.4就有了,但是由于log4j的存在,这个logger一直沉默着,事实上在一些測试性的代码中,jdk自带的logger比log4j ...

  7. python2.0_s12_day9_事件驱动编程&异步IO

    论事件驱动与异步IO 事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定.它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理.另外两种常见的编程范式是(单线程)同步以及 ...

  8. 【RF库Collections测试】Set To Dictionary

    Name:Set To DictionarySource:Collections <test library>Arguments:[ dictionary | *key_value_pai ...

  9. 硬件日志:/var/log/dmesg

    在 Linux 系统启动时,会在屏幕上显示许多与硬件有关的信息,这些信息记录在 /var/log/dmesg 文件中,也可以用 dmesg 命令来查看 [root@localhost]# head / ...

  10. PHP5 session 详解【经典】

    原文:http://www.pkwind.com/php5-session-xiang-jie-jing-dian http协议是WEB服务器与客户端 (浏览器)相互通信的协议,它是一种无状态协议.所 ...