权限管理
  创建一个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设计分析以及具体细节

    权限管理---设计分析以及具体细节 说起权限我们大家都知道,不一样的角色会有不一样的权限. 比如就像学生管理系统一样,管理员,老师,学生之间的权限都是不一样的,那么展示的页面也是不一样的. 所以,我们 ...

  2. rbac(基于角色权限控制)-------权限管理

    权限管理 创建一个rbac和app的应用,这个rbac主要是用来存放权限的,全称叫做基于角色权限控制 一.先看配置文件合适不,给创建的rbac在配置文件里面设置一下 找到INSTALLED_APPS= ...

  3. devops-jenkins基于角色的权限管理RBAC

    一. devops-jenkins基于角色的权限管理RBAC 1 安装角色的rbac角色管理  1.1) 点击系统管理 1.2) 选择插件管理 1.3) 选择可选插件,输入role搜索 1.4) 选择 ...

  4. Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架

    Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...

  5. 【基于url权限管理 shiro(一)】--基础

    只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源.权限管理包括用户认证和授权两部分.   用户认证 1.概 ...

  6. Asp.Net Core 2.0 项目实战(3)NCMVC角色权限管理前端UI预览及下载

    Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...

  7. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理10

    今天把用户的菜单显示和页面的按钮显示都做好了,下面先来个效果图 接下来说下我实现的方法: 首先我在每个方法前面都加了这个属性, /// <summary> /// 表示当前Action请求 ...

  8. RDIFramework.NET ━ 9.9 角色权限管理 ━ Web部分

    RDIFramework.NET ━ .NET快速信息化系统开发框架 9.9  角色权限管理 -Web部分 角色权限管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移 ...

  9. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理

    这是本人第一次写,写的不好的地方还忘包含.写这个的主要原因是想通过这个来学习下EF的CodeFirst模式,本来也想用AngularJs来玩玩的,但是自己只会普通的绑定,对指令这些不是很熟悉,所以就基 ...

随机推荐

  1. SqlServer try catch 捕获触发器\存储过程异常,结合 transaction 事务

    SoEasy~,贴上代码看所有 ALTER trigger [dbo].[tgr_SG_Gathering_update] on [dbo].[SG_Gathering] for update --更 ...

  2. python高级 之(零) --- 重点难点

    生成式子 列表生成式 字典生成式 深浅拷贝 list0 = [12,24,34,32,[64,23]] # 浅拷贝:浅拷贝只是将最外层容器拷贝一份放在堆里面,内层的容器不会被拷贝还是使用原来的地址 l ...

  3. caoz的梦呓:信息安全常识科普

    猫宁!!! 参考链接:https://mp.weixin.qq.com/s/cl4TfOodBGSjUuEU8e0rGA 对方公众号:caoz的梦呓 前天在新加坡IC咖啡做了一场关于信息安全的常识普及 ...

  4. 我和CMS的往事

    CMS(内容管理系统)放在web中理解,也就是我们常说的后台了,用于网站的日常管理.又到期末了,我们的课程——web程序设计,需要提交一份期末大作业,最近需要开发出一个基于JSP的简单web,所以呢, ...

  5. Tensorf实战第九课(自编码AutoEncoder)

    本节我们将了解神经网络进行非监督形式的学习,即autoencoder自编码 假设图片经过神经网络后再输出的过程,我们看作是图片先被压缩然后解压的过程.那么在压缩的时候,原有的图片质量被缩减,解压时用信 ...

  6. Git_mergetool_tutorial(转载)

    原文链接:https://gist.github.com/karenyyng/f19ff75c60f18b4b8149#table-of-content Table Of Content Skip t ...

  7. 使用choco 在windows 环境安装kubectl 并配置

    首先安装choco #以管理员身份运行cmd命令 @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -N ...

  8. json字符串转成 json对象 json对象转换成java对象

    import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject; 依赖包 <dependency> ...

  9. 区间最值的优秀数据结构---ST表

    ST表,听起来高大上,实际上限制非常多,仅仅可以求最值问题: 为什么?先从原理看起: st表运用了倍增的思想:st[i][j] = min(st[i][j - 1],st[i + 2^(j - 1)) ...

  10. 走环概率问题(至今有点迷)--牛客第二场( Eddy Walker)

    思路: 概率结论题,好像属于线性递推,现在也不太懂(lll¬ω¬) #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include < ...