一 表结构设计

 from django.db import models

 # Create your models here.
from django.db import models # Create your models here. # 用户表
class UserInfo(models.Model):
username = models.CharField(max_length=16, verbose_name="用户名")
password = models.CharField(max_length=32, verbose_name="密码")
roles = models.ManyToManyField(to="Role", null=True, blank=True)
# null=TRUE是告诉数据库这个字段可以为空,blank=True告诉djangoadmin可以不填 # 显示具体的内容
def __str__(self):
return self.username # 让字段显示中文
class Meta:
verbose_name = "用户表"
verbose_name_plural = verbose_name # 角色
class Role(models.Model):
title = models.CharField(max_length=32, verbose_name="角色名称")
permissions = models.ManyToManyField(to="Permission") def __str__(self):
return self.title class Meta:
verbose_name = "角色表"
verbose_name_plural = verbose_name # 权限表
class Permission(models.Model):
title = models.CharField(max_length=16, verbose_name="权限名称")
url = models.CharField(max_length=255, verbose_name="URL")
is_menu = models.BooleanField(default=False, verbose_name="可作为菜单展示")
icon = models.CharField(max_length=16, verbose_name="菜单图标", null=True, blank=True) def __str__(self):
return self.title class Meta:
verbose_name = "权限表"
verbose_name_plural = verbose_name

二 创建rbac权限管理项目

1. 为了实现项目结构的解耦,把权限系统单独写成一个app
  1. 创建APP
            Django中创建app的步骤
           1. python manage.py startapp rbac 在terminal终端里面运行
           2. 在settings.py中注册app
    rbac.apps.RbacConfig
2. 执行两条命令,把表结构同步到数据库把创建数据库的语句写在rbac的models文件里
  1. python manage.py makemigrations
  2. python manage.py migrate
3. 录入数据
  借助Django Admin
  Django admin的用法
  1. 创建超级用户,用来登陆admin管理后台
  python manage.py createsuperuser
  2. 将我们自己写的表注册到Django admin中
  在app/admin.py中按照固定的格式注册model

如下:

 

 from django.contrib import admin
from rbac import models
# 注册用户表
admin.site.register(models.UserInfo)
#注册角色表
admin.site.register(models.Role) # 自定义一个权限管理类
class PermissionAdmin(admin.ModelAdmin):
# 告诉django admin在页面上展示我这张表的那些字段
list_display = ["title","url","is_menu","icon"]
# 在列表页面可以编辑url
list_editable = ["url","icon","is_menu"] admin.site.register(models.Permission,PermissionAdmin)

三 权限的查询

权限查询的代码最好能拿出来单独封装一个函数,这样方便你以后可以直接用你写的rbac这个权限管理

1 在rbac目录下面新建一个python package 名字可以随便叫,然后新建一个py文件,名字也可以随便叫我这里叫:permission.py

 from django.conf import settings

 def init_permission(request, user_obj):
'''
在session中初始化权限信息和菜单信息的函数
:param request: 请求对象
:param user_obj:当前登录用户
:return:
''' # user_obj.roles.all()那到当前用户的所有角色
ret = user_obj.roles.all().values("permissions__url",
"permissions__icon",
"permissions__is_menu",
"permissions__title"
).distinct() # 取到去重之后的权限
# 定义一个权限列表
permission_list = []
# 定义一个专门用来存放当前用户菜单的列表
menu_list = []
for item in ret:
print(item) # item是个大列表
permission_list.append({"permissions__url": item["permissions__url"]}) # 添加到权限列表
if item["permissions__is_menu"]: # 如果为真
menu_list.append({
"title": item["permissions__title"],
"icon": item["permissions__icon"],
"url": item["permissions__url"]
}) # 将用户权限列表信息,存到session中
request.session[settings.PERMISSION_SESSION_KEY] = permission_list
# 把当前用户的所有菜单存放到sessioin
request.session[settings.MENU_SESSION_KEY] = menu_list

2 setting.py文件配置

# 设置白名单
PERMISSION_WHITE_URL=[
"/login/",
"/admin/.*",
]
#权限列表
PERMISSION_SESSION_KEY="permission_list" #菜单列表
MENU_SESSION_KEY="menu_list"

四 权限校验

应该将权限的校验功能放在中间件中的process_request()方法

1 在rbac目录下面新建一个python package包 middleware ,然后建一个rbac.py文件,名字可以随便取

 '''
自定义rbac中间件
'''
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect,HttpResponse,render
import re
from django.conf import settings class RBACMiddleware(MiddlewareMixin):
def process_request(self,request):
'''
自定义权限校验的中间件
:param request: 请求对象
:return:
'''
# 1 取到当前这次请求访问的url是什么
url=request.path_info # request.get_full_path()
# 过滤白名单
for item in settings.PERMISSION_WHITE_URL:
reg="^{}$".format(item)
if re.match(reg,url):
return None
# 取到当前用户的权限列表
permission_list=request.session.get(settings.PERMISSION_SESSION_KEY,None)
# 进行权限校验
if permission_list is None:
# 用户没登录
return redirect("/login/")
for i in permission_list:
reg="^{}$".format(i['permissions__url'])
if re.match(reg,url):
break
else:
return HttpResponse("你没有此权限")

2 然后在setting.py文件里注册一下

'rbac.middleware.rbac.RBACMiddleware',

五 项目登录函数的引用就是导入刚才封装好的初始化权限的函数

'''
跟用户相关的视图都写在这里
'''
from django.shortcuts import redirect, render, HttpResponse
from rbac.models import UserInfo
from rbac.service.permission import init_permission def login(request):
error_msg = ""
if request.method == "POST":
# 取用户名和密码
username = request.POST.get("username")
pwd = request.POST.get("password")
# 验证
user_obj = UserInfo.objects.filter(username=username, password=pwd).first()
if user_obj:
# 登录成功
# 调用封装好的初始化函数里面含有权限列表和显示菜单
init_permission(request,user_obj) return redirect("/customer/list/")
else:
error_msg = "用户名或密码错误" return render(request, "login.html")

六 页面中引用模板语言

1 首先在rbac下面新建一个python packages名字为templatetags(名字必须是这个)然后新建一个py文件,名字随意,我这里叫ooxx

filename 就是将你返回的结果给那个页面调用,show_menu就是你自定义的模板语言的名字

from django import template

from luffy_permission import settings

register = template.Library()

@register.inclusion_tag(filename="my_menu.html")
def show_menu(request):
# menu_list是你从session里面获取的用户的菜单列表
menu_list = request.session[settings.MENU_SESSION_KEY]
return {"menu_list": menu_list} # 把menu_list返回给my_menu.html这个页面

2 新建一个my_menu.html的文件,名字跟filename后面的一致,在rbac目录下新建一个templates

这个里面的menu_list就是你上面自定义的的返回结果,menu.icon代表是图标字段,menu.title代表是菜单名字

 {% for menu in menu_list %}
<a href="{{ menu.url }}" class="active">
<span class="icon-wrap"><i class="fa {{ menu.icon }}"></i></span> {{ menu.title }}</a> {% endfor %}

3 让你真正给用户看的html页面去引用ooxx,就是在菜单的div里面加上这个 request是show_menu的一个参数

      <div class="static-menu">
{% load ooxx %}
{% show_menu request %} </div>

七 rbac权限目录结构

新的项目中如何引用rbac权限管理##########################################################

1. 拷贝rbac这个app到项目中
2. 把rbac/migrations目录下的迁移记录都删掉
3. 在项目中注册rbac这个app
4. 创建数据库迁移(执行那两条命令)

1. python manage.py makemigrations
2. python manage.py migrate

5. 注册admin,录入数据 --> 自动发现并录入权限URL
6. 在登录流程中初始化权限信息,配置登录函数引用封装好的初始化权限

from django.shortcuts import render, HttpResponse, redirect
from django.conf import settings
from rbac.service.permission import init_permission
from rbac.models import UserInfo # Create your views here.
def login(request):
if request.method == "POST":
username = request.POST.get("username")
pwd = request.POST.get("password") user_obj = UserInfo.objects.filter(username=username, password=pwd).first()
if user_obj:
# 登录成功
# 初始化权限信息
init_permission(request, user_obj)
return redirect("/book_list/")
return render(request, "login.html") def book_list(request):
return render(request, "book_list.html") def book_add(request):
return render(request, "book_add.html")

7. 注册中间件
8. 在settings.py中设置权限相关的配置项

# 设置白名单
PERMISSION_WHITE_URL=[
"/login/",
"/admin/.*",
]
#权限列表
PERMISSION_SESSION_KEY="permission_list" #菜单列表
MENU_SESSION_KEY="menu_list"

9 在html列表页面引用

   {% load ooxx %}
{% show_menu request %}
												

22-1 rbac权限设计的更多相关文章

  1. ASP.NET 系列:RBAC权限设计

    权限系统的组成通常包括RBAC模型.权限验证.权限管理以及界面访问控制.现有的一些权限系统分析通常存在以下问题: (1)没有权限的设计思路 认为所有系统都可以使用一套基于Table设计的权限系统.事实 ...

  2. RBAC 权限设计(转载)

    来源 :https://blog.csdn.net/rocher88/article/details/43190743 这是我在网上找的一些设计比较好的RBAC权限管理 不知道,像新浪.搜狐.网易.百 ...

  3. RBAC权限设计(一)

    序言 RBAC表结构 用户表 角色表 权限表 用户角色(关系)表 角色权限(关系)表 sql脚本 /* Navicat MySQL Data Transfer Source Server : 127. ...

  4. RBAC权限设计

    http://blog.csdn.net/ms_x0828/article/details/7035956 RBAC 模型作为目前最为广泛接受的权限模型 角色访问控制(RBAC)引入了Role的概念, ...

  5. RBAC权限设计实例

    http://blog.csdn.net/painsonline/article/details/7183629 实现业务系统中的用户权限管理 B/S系统中的权限比C/S中的更显的重要,C/S系统因为 ...

  6. RBAC权限设计实例(转)

    实现业务系统中的用户权限管理 B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户的权限检测可以通过客户端实现或通过客户端+服务器检测实现,而B/S中,浏览器是每一台 ...

  7. 百万年薪python之路 -- RBAC角色权限设计

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用 ...

  8. 基于RBAC的权限设计模型

    个部件模型组成,这4个部件模型分别是基本模型RBAC0(Core RBAC).角色分级模型RBAC1(Hierarchal RBAC).角色限制模型RBAC2(Constraint RBAC)和统一模 ...

  9. (转)RBAC权限表的设计

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

随机推荐

  1. 关于 matplotlib

    注意,需要 zlib, 需要 Tkinter pip install matplotlib import numpy as np import matplotlib.pyplot as plt plt ...

  2. 【JZOJ5233】【GDOI模拟8.5】概率博弈 树形dp+期望

    题面 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有一颗棋子.两人轮流 ...

  3. E浏览器常见的9个css Bug以及解决办法

    我们在浏览网页的时候经常看见这样的现象:某个网页在IE6浏览器中打开很正常,但是在IE8里面打开可能完全变形了.或者也有可能出现完全相反的现象.这让Web程序员及设计师往往为了其CSS在各个IE版本下 ...

  4. 哈哈哈哈,我竟然发现了个MSDN里面的笔误

    typedef __PROCESSOR_INFO {  WORD wVersion;   WCHAR szProcessorCore[40];  WORD wCoreRevision;  WCHAR ...

  5. 基于pytest的接口测试

    最近要开展接口测试,起初打算使用公司已有的Fitnesse测试工具来进行接口测试.过程中发现,构造接口字段数据.测试数据都比较困难,接口参数多的时候,用例量就会很多,关键执行速度还慢.所以放弃了. 找 ...

  6. Django与HTML业务基本结合

    app里都有migrations文件 app: migrations 数据修改表结构,数据库操作记录 admin Django为我们提供后台管理 apps 配置当前app models ORM,写指定 ...

  7. Handling Missing Values

    1) A Simple Option: Drop Columns with Missing Values 如果这些列具有有用信息(在未丢失的位置),则在删除列时,模型将失去对此信息的访问权限. 此外, ...

  8. Spring_事务

    事务管理: 用来确保数据的完整性和一致性 事务就是一系列的动作,它们被当做一个单独的工作单元.这些动作要么全部完成,要么全部不起作用 事务的四个关键属性 原子性 一致性 隔离性 持久性 Spring两 ...

  9. TextBlock中显示文字和图片,且不会自动换行

    原本TextBlock显示图片是很容易的,即TextBlock.Inlines.Add(UiElement   element):这个方法即可, 但是,会出现如下效果: 我不想要这种效果,所以改了下代 ...

  10. Http响应response(文件下载、验证码)

    Http响应response response:响应 作用: 往浏览器写东西 组成部分: 响应行 响应头 响应体 操作响应行 格式: 协议/版本 状态码 状态码说明 状态码: 1xx:已发送请求 2x ...