权限管理
  创建一个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. android4.2 webkit 中的jni

    在android 应用开发中使用WebView,当一个webveiw 被创建时, 也会去load 他所对应的动态库,这里动态库也就是传说中的webkit 内核等. C++ 层与java 层的交互也是通 ...

  2. 如何将其它javaweb项目变成可以成功在自己eclipse环境中运行的javaweb项目?

    说明:此文档仅适用于以下两种情况     (1)myeclipse项目需要在eclipse环境中运行     (2)eclipse项目,但是无法在自己的电脑eclipse环境中运行     注意:以下 ...

  3. git 添加第二个远程仓库地址,一次修改到处上传~

    上传本机git 公钥到对应的代码托管平台 github/码云等 本地仓库执行 git remote set-url --add origin https://gitee.com/qichengTech ...

  4. Hanlp配置自定义词典遇到的问题与解决方法

    本文是整理了部分网友在配置hanlp自定义词典时遇到的一小部分问题,同时针对这些问题,也提供另一些解决的方案以及思路.这里分享给大家学习参考. 要使用hanlp加载自定义词典可以通过修改配置文件han ...

  5. 卸载mysql后再安装提示The service already exists!问题解决方法

    卸载mysql后再安装输入mysqld --install 回车后提示The service already exists! 原因:卸载的时候没有卸载干净 方法: 一.重新以管理员身份打开cmd 二. ...

  6. Ubuntu中配置Python虚拟环境Virtualenv

    Ubuntu版本为18.04 Virtualenv介绍 在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4.所有第三方的包都会被pip安装到Python3的site-pac ...

  7. Redis安全策略

    1. 开启redis密码认证,并设置高复杂度密码 描述 redis在redis.conf配置文件中,设置配置项requirepass, 开户密码认证. redis因查询效率高,auth这种命令每秒能处 ...

  8. Binding的简单使用

    Binding可以看作是数据的桥梁,两端分别为Source和Target,一般情况,Source是逻辑层的对象,Target是UI层的控件对象,可以将数据从逻辑层送往UI层展现 简单的例子: clas ...

  9. O013、动手实践Linux VLAN

    参考https://www.cnblogs.com/CloudMan6/p/5326737.html   本节我们来看如何在实验环境中实施和部署如下的VLAN 网络  

  10. 淘宝flexible.js的使用

    首先大家最关注的怎么使用,原理不原理是后面的事 比如设计稿量来的宽度是100px 那么我们布局的时候,就这么写{width:1.3333rem},1.3333rem是由100/75算出来的,以此类推2 ...