rbac 权限控制组件

  • 基于角色的权限控制
  • 本质每个权限即为一个 URL

项目组件结构

表结构

Role (title, permission) -(ManyToManyField)-   User   (name, pwd, roles)  

     |                       

(ManyToManyField)

     |                                 

Permission (title, url)

 实际生成表 及 测试数据

Django_rbac/ rbca/models.py

from django.db import models

# Create your models here.

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

核心代码部分

Django_rbac/ rbac/service/permission.py 

  用于获取当前用户的权限信息

"""
为了解耦,将处理权限的代码保存在组件里面
""" def initial_session(user,request):
# 查看当前用户的所有的权限
# 因为会有values 的原理会导致有重复需要去重
ret = user.roles.all().values("permissions__url").distinct()
permission_list = []
# 将所有的权限保存在一个列表里面,稍微处理下数据便于操作
for i in ret:
permission_list.append(i["permissions__url"])
# 把用户的用户权限保存在 session 里面
request.session["permission_list"] = permission_list

Django_rbac/rbac/service/rbca.py 

  基于当前用户的权限信息对来访请求进行逻辑判断筛选返回结果

    为了不冗余代码写在中间件中,对每一次的请求都做计算

    因中间件的工作机制导致所有的请求都被计算,需要对特殊的 URL 进行特殊处理

import re
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse, redirect
"""
写在中间件里面可以完全避免每次都要重复校验的问题
在请求来的时候进行校验,因此要写在 process_request 方法里面
""" class ValidPermission(MiddlewareMixin):
def process_request(self,request):
# 当前访问路径
current_path = request.path_info
"""
检查是否属于白名单
admin 的内部流程
不允许一上来就访问首页,必须要跳转到 登陆页面
http://127.0.0.1:8000/admin/login/?next=/admin/
第二次跳转到登录页面的请求如果没有被定义可通过就会被拦截
无法只使用 admin 为过滤选项
不能用 in 单纯的判断,还是要用到正则处理
需要放过所有 admin 开头的 url
"""
valid_url_list = ["/login/","/reg/","/admin/.*"]
for valid_url in valid_url_list:
ret = re.match(valid_url,current_path)
if ret:
# 中间件 return None 表示这个中间件已经执行完毕
return None """
校验是否登录
对于没有登陆的用户返回报错应该是让他去登陆
"""
user_id = request.session.get("user_id")
if not user_id:
return redirect("/login/") """
校验权限
在编辑,以及删除页面的时候 url 不是固定的,
会有内含的参数,因此权限列表里面不能仅仅是写死的url
也不能再单纯的用 in 来判断。还是要靠正则来处理
将权限列表里面的权限信息用 正则表达式来保存
然后对访问页面进行验证是否可以通过来处理
"""
permission_list = request.session.get("permission_list",[])
flag = False
for permission in permission_list:
permission = f"^{permission}$"
ret = re.match(permission, current_path)
if ret:
flag = True
break
if not flag:
return HttpResponse("没有访问权限! ")
return None

   不要忘记注册在 Django_rbac\Django_rbac\settings.py 里面 

 

其他app 引用使用

Django_rbac/app01/views.py 

from django.shortcuts import render,HttpResponse
import re
# Create your views here.
from rbac.models import *
from rbac.service.perssions import initial_session def users(request):
user_list=User.objects.all()
return render(request,"users.html",locals()) def add_user(request):
permission_list = request.session["permission_list"]
return HttpResponse("add user.....") def roles(request):
role_list=Role.objects.all()
return render(request,"roles.html",locals()) 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:
# 把用户的id 保存在 session 里面
request.session["user_id"] = user.pk
# 查询当前用户的所有的权限
initial_session(user,request)
return HttpResponse("登录成功!")
return render(request, "login.html",locals())

测试页面代码

  这个就比较随意了,看个结果而已。

Django_rbac\templates\login.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body> <h4>登录页面</h4> <form action="" method="post">
{% csrf_token %} 用户名:<input type="text" name="user">
密码:<input type="password" name="pwd">
<input type="submit">
</form> </body>
</html>

Django_rbac\templates\roles.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body> <h4>角色列表</h4>
<ul>
{% for role in role_list %}
<p>{{ role }}</p>
{% endfor %} </ul> </body>
</html>

Django_rbac\templates\users.html

 <!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body> <h4>用户列表</h4>
<ul>
{% for user in user_list %}
<p>{{ user }}</p>
{% endfor %} </ul> </body>
</html>

Django_rbac_demo 权限控制组件框架模型的更多相关文章

  1. Django_RBAC_demo2 升级版权限控制组件

    RBAC 升级版 预期要求 前端在无权限时不在提供操作标签 更改部分硬编码 实现更加精准的权限控制 未改动前的版本 在这里 ⬇ Django_rbac_demo 权限控制组件框架模型 具体更改 数据库 ...

  2. 基于.netstandard的权限控制组件

    基于.netstandard的权限控制组件 Intro 由于项目需要,需要在 基于 Asp.net mvc 的 Web 项目框架中做权限的控制,于是才有了这个权限控制组件. 项目基于 .NETStan ...

  3. shiro太复杂?快来试试这个轻量级权限认证框架!

    前言 在java的世界里,有很多优秀的权限认证框架,如Apache Shiro.Spring Security 等等.这些框架背景强大,历史悠久,其生态也比较齐全. 但同时这些框架也并非十分完美,在前 ...

  4. Flex-Security权限控制框架

    转自:http://code.google.com/p/flex-security/ flex UI组件权限控制框架 一.快速开始 1) 下载并添加flex_security.swf在你的flex l ...

  5. 【PSR规范专题(1)】PSR-0+namespace+spl_autoload_register实现框架模型

    了解命名空间 namespace是PHP5.3版本加入的新特性,用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题: 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/ ...

  6. ThinkPHP框架模型连贯操作(八)

    原文:ThinkPHP框架模型连贯操作(八) Thinkphp的连贯操作使用起来也是很灵活: *可能这里有的mysql函数没全部罗列出来,大家可以举一反三,形式雷同 一.常用连贯操作 1.where ...

  7. Java安全(权限)框架 - Shiro 功能讲解 架构分析

    Java安全(权限)框架 - Shiro 功能讲解 架构分析 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 简述Shiro Shiro出自公司Apache(阿帕奇),是java的一 ...

  8. 类Shiro权限校验框架的设计和实现(2)--对复杂权限表达式的支持

    前言: 我看了下shiro好像默认不支持复杂表达式的权限校验, 它需要开发者自己去做些功能扩展的工作. 针对这个问题, 同时也会为了弥补上一篇文章提到的支持复杂表示需求, 特地尝试写一下解决方法. 本 ...

  9. 运行时权限请求框架easypermissions

    前言 之前使用过AndPermission权限申请库,当开发者执行有权限的代码发生异常时,AndPermission会抓到异常并回调到失败中,这里要注意的是会抓到任何异常,不仅仅是没有权限时的异常. ...

随机推荐

  1. 从.Net到Java学习第六篇——SpringBoot+mongodb&Thymeleaf&模型验证

    SpringBoot系列目录 SpringBoot整合mongodb MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.如果你没用过Mong ...

  2. iOS ----------将照片保存到相册

    在使用前  请导入photos.framework 然后导入 #import <Photos/PHPhotoLibrary.h> #import <Photos/PHAssetCha ...

  3. c#核心基础-委托

    委托是一个类型.C#中的委托是面向对象的,并且它是类型安全的 当创建委托实例的时候,创建的实例会包含一个调用列表,在调用列表中可以包含多个方法.每个方法称作一个调用实体.调用实体可以是静态方法,也可以 ...

  4. C#如何生成JSON字符串提交给接口(服务器)

    C#如何生成JSON字符串提交给接口(服务器)   第一章:C#如何拿到从http上返回JSON数据? 第二章:C#如何解析JSON数据?(反序列化对象) 第三章:C#如何生成JSON字符串?(序列化 ...

  5. macos 远程 windows 10

    使用的工具:Parallels Client 免费,可以从windows store 免费下载: 只有这个最好用,希望能帮到你.和原生的windows 远程桌面功能很像:

  6. Enterprise architect 类图加时序图

    原文地址:https://segmentfault.com/a/1190000005639047#articleHeader2 新建一个Project 没什么好说的,“文件-新建项目”,然后选择保存位 ...

  7. ORACLESQL语句的优化

    ORACLESQL语句的优化: 选择最有效率的表名顺序:应该选择记录条数最少的表作为基表! 因为Oracle解析器的处理顺序是从右至左的.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们. ...

  8. DeveloperGuide Hive UDF

    Creating Custom UDFs First, you need to create a new class that extends UDF, with one or more method ...

  9. 前端请求参数MD5加密发送后台

    最近在项目开发中遇到前端发送参数加密的问题,网上查找半天也是很乱,小编自己在项目开发中总结了一下,写到博客中,希望能够帮助大家. 查看所有代码可到我的github上查看源文件,下载后在控制台查看结果即 ...

  10. SDOI2019R1游记

    差点退役,真是开心 Day -2 吐了一晚上,差点死掉 被拉去医院打针,结果蛇皮的被扎了两针,真是好疼啊嘤嘤嘤 决定第二天在家里咕一天 Day -1 结果在家里也得做\(loli\)昨天的不知道从哪里 ...