权限管理
  创建一个rbac和app的应用,这个rbac主要是用来存放权限的,全称叫做基于角色权限控制
  一、先看配置文件合适不,给创建的rbac在配置文件里面设置一下
    找到INSTALLED_APPS=【'rbac'】
  二、设计表结构
    models中创建类:五个类,七张表
    角色表:
    用户表:
    权限表:

     组表:

     菜单表:

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

    所以有会多生成两张关系表

    一个菜单下面有多个组

    一个组下面有多个菜单

    一个菜单下面有多个权限

from django.db import models

# Create your models here.
class Role(models.Model):
'''
角色表
'''
title = models.CharField(max_length=32,verbose_name="角色名")
permissions = models.ManyToManyField(to="Permission",verbose_name="具有的所有权限", blank=True) # 建立用户表和角色表的多对多关系 def __str__(self):
return self.title class Meta:
verbose_name_plural = "角色表" class Group(models.Model):
caption = models.CharField(max_length=32,verbose_name="组名称")
menu = models.ForeignKey(to="Menu",verbose_name="所属菜单",default=1,related_name="menu")
class Menu(models.Model):
title = models.CharField(max_length=32) class Permission(models.Model):
'''
权限表
'''
title = models.CharField(max_length=32,verbose_name="标题")
url = models.CharField(max_length=64,verbose_name="带正则的URL")
# is_mune = models.BooleanField(verbose_name="是否是菜单",default=0)
menu_gp = models.ForeignKey(verbose_name="组内菜单",to="Permission",blank=True,null=True) #自关联
#主页就可以设置为菜单,当点击菜单的时候才可以做具体的操作
codes = models.CharField(max_length=32,verbose_name="代码",default=1)
group = models.ForeignKey(to="Group",verbose_name="所属组",null=True) #新添加的字段记得设置默认值 def __str__(self):
return self.title class Meta:
'''中文显示'''
verbose_name_plural = "权限表"
class UserInfo(models.Model):
'''
用户表
'''
username = models.CharField(max_length=32,verbose_name="用户名")
password = models.CharField(max_length=64,verbose_name="密码")
email = models.CharField(max_length=32,verbose_name="邮箱")
roles = models.ManyToManyField(to="Role",verbose_name="具有的所有角色",blank=True) #建立用户和角色的多对多关系 def __str__(self):
return self.username class Meta:
verbose_name_plural = "用户表"

  三、通过django admin录入权限数据
    - 先创建一个超级用户
    - 用户名 root
    - 密码 zhy123456
    - 在admin.py 中
      from rbac import models
      admin.site.register(models.Permission)
      admin.site.register(models.Role)
      admin.site.register(models.UserInfo)
      这样的话上去的是英文的,如果你想让中文显示就在类中加一个类
      class Meta:
      verbose_name_plural = "权限表"
      - 当你给关联字段录入数据的时候会有错误提示,那么在类中你的那个关联字段在加一个属性blank = True 可以为空
      permissions = models.ManyToManyField(to="Permission",verbose_name="具有的所有权限", blank=True)

  四、编写登录
    用户登录后:
      获取当前用户具有的所有角色
      获取当前用户具有的所有权限(并且去重)

      #获取当前的用户对象
      user = models.UserInfo.objects.filter(username=name,password=password).first()
      #获取当前用户的所有角色user.roles.all()
      #获取当前用户的所有权限
      permission_list = user.roles.all().values("permissions__title","permissions__url","permissions__is_mune").distinct()
      print(permission_list)

      登录成功之后初始化---把所有的url都拿出来并且保存到session里
        1、可以建一个server的包,在里面建一个初始化的init_perssion.py文件
        2、定义函数

#!usr/bin/env python
# -*- coding:utf-8 -*-
from rbac import models
from day7权限管理 import settings
def init_permission(user,request):
#获取当前的用户对象
'''
获取所有权限中的url并放在session中
:param user:
:param request:
:return:
''' #user.roles.all()获取当前用户的所有角色
#获取当前用户的所有权限
permission_list = user.roles.all().values(
"permissions__id",
"permissions__title", #用户列表
"permissions__url", #url
"permissions__menu_gp", #组内菜单id,如果为null表示是菜单
"permissions__codes",
"permissions__group_id",
"permissions__group__menu__title", #菜单名称
"permissions__group__menu__id" #菜单id
).distinct() print("-----------------",permission_list)
#菜单相关
sub_permisson_list = []
for item in permission_list:
tpl = {
"id":item["permissions__id"],
"title":item["permissions__title"],
"url":item["permissions__url"],
"menu_group_id":item["permissions__group_id"],
"menu_id":item["permissions__group__menu__id"],
"menu_title":item["permissions__group__menu__title"]
}
sub_permisson_list.append(tpl)
request.session[settings.PERMISSION_MENU_KEY] = sub_permisson_list
# 1、去掉不是菜单的url
# 菜单操作
# menu_list = []
# for item in permission_list:
# if not item["permissions__is_mune"]: # 如果不是菜单就继续
# continue
# else: # 否则是菜单的话就把菜单添加到列表里面
# tpl = {
# "menu_id": item["permissions__group__menu__id"],
# "menu_title": item["permissions__group__menu__title"],
# "title": item["permissions__title"],
# "url": item["permissions__url"],
# "active": False
# }
# menu_list.append(tpl)
# request.session[settings.PERMISSION_MENU_KEY] = menu_list #吧所有的菜单都放在session里面
# print("xcvxvxv", menu_list) # 权限相关
result = {}
for item in permission_list:
group_id = item["permissions__group_id"]
url =item["permissions__url"]
code = item["permissions__codes"]
if group_id in result:
#如果在说明url和code已经生成了
result[group_id]["codes"].append(code)
result[group_id]["urls"].append(url)
else:
#如果不在就添加进去
result[group_id] ={
"codes":[code,],
"urls":[url]
}
# print(result)
#吧所有权限中的url字典放到session中
request.session[settings.PERMISSION_URL_DICT_KEY] = result # # 打印的结果如下
# result = {
# 1: {
# "codes": ["list", "add", "del", "edit"]
# "urls": [
# "/userinfo/",
# "/userinfo/add" ,
# "/userinfo/del(\d+)/ ",
# "/userinfo/edit(\d+)/ ",
# ]
# },
# 2: {
# "codes": {"list", "add", "del", "edit"}
# "urls": [
# "/order",
# "/order/add" ,
# "/order/del(\d+)/ ",
# "/order/edit(\d+)/ ",
# ]
# }
# }

   五、中间件
      - 在setting里设置白名单(不用权限就可以访问)

#白名单
VALID_URL = [
"/login/",
"/admin.*/",
"/index/"
] # ==================rabc==============
PERMISSION_URL_DICT_KEY="permissions_url_dict"
PERMISSION_MENU_KEY = "menu_list"
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.middlewears.rbac.Middle',
]

      - 获取当前的url请求
      - 获取session保存的权限信息

      - 循环url进行正则匹配,如果匹配成功就有权访问,不成功就无法访问

用中间件的时候记得要在settings里面配置一下:

#!usr/bin/env python
# -*- coding:utf-8 -*-
import re
from django.shortcuts import render,HttpResponse,redirect
from django.conf import settings
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 Middle(MiddlewareMixin):
def process_request(self,request):
#获取当前的url请求
current_url = request.path_info #拿到当前的路径
# print(request.path,current_url)
#获取Session中保存当前用户的权限,
# request.session.get("permissions_url_list")
# 如果当前的路径和session里面保存的url一样就break了,如果不一样就说明无权访问
for url in settings.VALID_URL:
# print(url,current_url)
if re.match(url,current_url):
return None #如果url是表名单白名单里面的,就让直接走后面的 permission_dict = request.session.get(settings.PERMISSION_URL_DICT_KEY)
#在初始化的时候把url以字典的显示存在了session里面,现在获取的也就是一个字典了
# print("==========",permission_dict)
flag = False
for group_id,code_url in permission_dict.items():
for url in code_url["urls"]:
regax = "^{0}$".format(url)
# print(regax,current_url)
if re.match(regax,current_url):
#match只要是..开头的都能匹配到,多以的加个^和$符
request.permission_code_list=code_url["codes"]
flag = True
break
if flag: #跳出外层循环
break
if not flag:
return HttpResponse("无权访问") def process_response(self,request,response):
return response

rbac(基于角色权限控制)-------权限管理的更多相关文章

  1. RBAC(基于角色的访问控制权限)表结构

    Rbac 支持两种类,PhpManager(基于文件的) 和 DbManager(基于数据库的) 权限:就是指用户是否可以执行哪些操作 角色:就是上面说的一组操作的集合,角色还可以继承 在Yii2.0 ...

  2. Yii中 RBAC(基于角色的访问控制权限)表结构原理分析

    这里有几个概念很重要,我简单用大白话说一下; 权限:就是指用户是否可以执行哪些操作. 如:小张可以发帖.回帖.浏览,小红只能回帖.浏览 角色:就是上面说的一组操作的集合. 如:高级会员有发帖.回帖.删 ...

  3. php : RBAC 基于角色的用户权限控制-表参考

    --管理员表 CREATE TABLE `sw_manager` ( `mg_id` int(11) NOT NULL AUTO_INCREMENT, `mg_name` varchar(32) NO ...

  4. Jenkins配置基于角色的项目权限管理--转

    本文将介绍如何配置jenkins,使其可以支持基于角色的项目权限管理. 由于jenkins默认的权限管理体系不支持用户组或角色的配置,因此需要安装第三发插件来支持角色的配置,本文将使用Role Str ...

  5. Jenkins配置基于角色的项目权限管理

    转自: http://www.cnblogs.com/gao241/archive/2013/03/20/2971416.html, 版权归原作者. 本文将介绍如何配置jenkins,使其可以支持基于 ...

  6. jenkins配置基于角色的项目权限管理设置步骤

    jenkins配置基于角色的项目权限管理设置步骤 本文链接:https://blog.csdn.net/russ44/article/details/52276222 由于jenkins默认的权限管理 ...

  7. 自学Aruba5.1-Aruba 基于角色(role)的策略管理(重点)

    点击返回:自学Aruba之路 自学Aruba5.1-Aruba 基于角色(role)的策略管理(重点) 1. 角色Role介绍 在ArubaOS中,用户(User)指的是已经完成连接,并获取到IP地址 ...

  8. RBAC基于角色的权限管理模型

    一.权限管理模型的必要性: a. 安全性:防止误操作,防止数据泄露,保证信息的安全. b. 数据隔离:保持不同的角色具有不同的权限,只能看到自己权限范围内的数据 二.权限管理模型的发展: a. 传统的 ...

  9. RBAC 基于角色的权限管理的简单实现

    1.什么是权限管理,权限管理就是对后台功能的细分,和对不同工作人员划分不同的工作的管理 RBAC是如何实现的,通过对不同控制器和控制器不同方法的限制,实现的管理. 要实现RBAC需要三张表,一张用户表 ...

  10. MVC基于角色权限控制--用户管理

    用户管理模块包括 新增用户.修改用户.展示用户列表.删除用户.用户角色分配.用户角色删除.用户权限分配 这里只介绍关于权限有关的 用户角色分配.用户角色删除.用户权限分配 新建控制器 UserInfo ...

随机推荐

  1. Javascript入门(四)条件控制语句

    一.条件控制语句 1. if <script type="text/javascript"> var num = 1 if( num == 3 ){ alert(&qu ...

  2. Maven多模块项目管理小结

    原文地址:http://blog.csdn.net/whuslei/article/details/7989102 题记 最近刚完成一个用Maven构建的Web项目,看了一些Maven方面的书,比如& ...

  3. java基础梳理--朝花夕拾(一)

    简介: Java是一种撰写跨平台应用软件的面向对象语言,1995年由Sun Microsystems公司推出. 2009年04月20日,甲骨文74亿美元收购Sun,取得java的版权. 2011年7月 ...

  4. linux中的shell编程----基础

    1,运行shell脚本有两种办法一般有两种: 先给可执行权限,再进入文件所在的目录,输入:./name.sh: 运行解释器再执行脚本:/bin/sh name.sh,这种情况下,脚本中可以没有#!/b ...

  5. nginx基础命令

    1.nginx 启动nginx service nginx start 查看nginx状态 service nginx status 关闭nginx service nginx stop 热重启(前提 ...

  6. 【CentOS7.0】虚拟机如何实现扩展存储空间

    写在前面的一些小废话 有时候,虚拟机随着使用,会导致存储不够,这时就需要给虚拟机扩容. 扩容的前提是,此虚拟机没有快照. 扩容时,需要编辑虚拟机设置.为了形成对比,第一张图片是扩容前,第二张图片是扩容 ...

  7. Zynq-Linux移植学习笔记之27UIO机制响应外部中断实现【转】

    转自:https://blog.csdn.net/zhaoxinfan/article/details/80285150 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...

  8. 从运维角度来分析mysql数据库优化的一些关键点【转】

    概述 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善. 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分 ...

  9. aiojobs

    import asyncio import aiojobs async def coro(timeout): print(timeout) await asyncio.sleep(timeout) p ...

  10. 解决python发送multipart/form-data请求上传文件的问题

    服务器接收文件时,有时会使用表单接收的方式,这意味着我们需要使用Python的requests上传表单数据和文件. 常用的方式一般如下: data = { 'name': 'nginx' } file ...