models.py

from django.db import models
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) action=models.CharField(max_length=32,default="")
group=models.ForeignKey("PermissionGroup",default=1)
def __str__(self):return self.title class PermissionGroup(models.Model):
title = models.CharField(max_length=32) def __str__(self): return self.title

admin.py

from django.contrib import admin

# Register your models here.
from .models import *
class PerConfig(admin.ModelAdmin):
list_display = ["title","url","group","action"]
admin.site.register(User)
admin.site.register(Role)
admin.site.register(Permission,PerConfig)
admin.site.register(PermissionGroup)

templatetags-->my_tags.py

from django import template
from rbac.service.rbac import reg
register=template.Library() @register.inclusion_tag("rbac/menu.html")
def get_menu(request,):
# 获取当前用户可以放到菜单栏中的权限
menu_permission_list = request.session["menu_permission_list"] return {"menu_permission_list":menu_permission_list} @register.simple_tag
def valid(link,request):
from bs4 import BeautifulSoup
soup=BeautifulSoup(link,"html.parser")
print(soup.a.get('href'))
path=soup.a.get('href')
flag=reg(request,path)
if flag:
return link
else:return ""

service-->perssions.py

def initial_session(user, request):
# 方案1
# [{},{},{}]
# permissions = user.roles.all().values("permissions__url").distinct() #distinct去重
#
# permission_list = []
#
# #循环字典拿到每个字典对应的字段,只放url
# for item in permissions:
# permission_list.append(item["permissions__url"])
# print(permission_list)
#
# request.session["permission_list"] = permission_list
# 方案2
permissions = user.roles.all().values("permissions__url", "permissions__group_id", "permissions__action").distinct()
print("permissions", permissions) permission_dict = {}
for item in permissions:
gid = item.get('permissions__group_id') if not gid in permission_dict: permission_dict[gid] = {
"urls": [item["permissions__url"], ],
"actions": [item["permissions__action"], ]
}
else:
permission_dict[gid]["urls"].append(item["permissions__url"])
permission_dict[gid]["actions"].append(item["permissions__action"]) # print(permission_dict)
request.session['permission_dict'] = permission_dict # 注册菜单权限
permissions = user.roles.all().values("permissions__url", "permissions__action","permissions__group__title").distinct()
# print("permissions", permissions) menu_permission_list = []
for item in permissions:
if item["permissions__action"] == "list":
menu_permission_list.append((item["permissions__url"], item["permissions__group__title"])) # print(menu_permission_list)
request.session["menu_permission_list"] = menu_permission_list

service-->rbac.py

import re
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,redirect def reg(request,current_path):
# 校验权限1(permission_list)
permission_list = request.session.get("permission_list", [])
flag = False
for permission in permission_list: permission = "^%s$" % permission ret = re.match(permission, current_path)
if ret:
flag = True
break
return flag class ValidPermission(MiddlewareMixin): def process_request(self,request):
# 当前访问路径
current_path = request.path_info # 检查是否属于白名单
valid_url_list=["/login/","/reg/","/admin/.*"] for valid_url in valid_url_list:
ret=re.match(valid_url,current_path)
if ret:
return None # 校验是否登录 user_id=request.session.get("user_id") if not user_id:
return redirect("/login/")
# 校验权限 (permission_list)
# permission_list = request.session.get("permission_list",[]) # ['/users/', '/users/add', '/users/delete/(\\d+)', 'users/edit/(\\d+)']
#
# flag = False
# for permission in permission_list:
#
# permission = "^%s$" % permission
#
# ret = re.match(permission, current_path)
# if ret:
# flag = True
# break
# if not flag:
# return HttpResponse("没有访问权限!")
#
# return None
# 校验权限2
permission_dict=request.session.get("permission_dict")
for item in permission_dict.values():
urls=item['urls']
for reg in urls:
reg="^%s$"%reg
ret=re.match(reg,current_path)
if ret:
print("actions",item['actions'])
request.actions=item['actions']
return None return HttpResponse("没有访问权限!")

urls.py

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^users/$', views.users),
url(r'^users/add', views.add_user),
url(r'^users/delete/(\d+)', views.del_user),
url(r'^roles/', views.roles),
url(r'^login/', views.login),
]

app01--views.py

from django.shortcuts import render,HttpResponse

# Create your views here.

from rbac.models import *

class Per(object):
def __init__(self,actions):
self.actions=actions
def add(self):
return "add" in self.actions
def delete(self):
return "delete" in self.actions
def edit(self):
return "edit" in self.actions
def list(self):
return "list" in self.actions def users(request):
user_list=User.objects.all()
# 查询当前登录人得名字
id = request.session.get("user_id")
user = User.objects.filter(id=id).first()
per=Per(request.actions)
return render(request, "users.html", locals()) import re
def add_user(request):
return HttpResponse("add user.....") def del_user(request,id):
return HttpResponse("del"+id) def roles(request):
role_list=Role.objects.all()
return render(request,"roles.html",locals()) from rbac.service.perssions import * 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:
############################### 在session中注册用户ID######################
request.session["user_id"]=user.pk
###############################在session注册权限列表##############################
# 查询当前登录用户的所有角色
# ret=user.roles.all()
# print(ret)# <QuerySet [<Role: 保洁>, <Role: 销售>]> # 查询当前登录用户的所有权限
initial_session(user,request)
return HttpResponse("登录成功!") return render(request,"login.html")

rbac---> template--->rbac---> users.html

    {% extends 'base.html'%} 
  {% block con %} 

  {% valid '<a href="/users/add/" class="btn btn-primary">添加用户</a>' request %}
<h4>用户列表</h4> {% if per.add %}
<a href="users/add/" class="btn btn-primary">添加用户</a>
{% endif %}
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>序号</th>
<th>姓名</th>
<th>角色</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for user in user_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ user.name }}</td>
<td>
{% for role in user.roles.all %}
{{ role.title }}
{% endfor %} </td>
<td>
{% if per.delete %}
<a href="/users/delete/{{ user.pk }}" class="btn btn-danger">删除</a>
{% endif %}
{% if per.edit %}
<a href="" class="btn btn-warning">编辑</a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
rbac---> template--->rbac---> roles.html

{% extends 'rbac/base.html' %}

{% block con %}

    <h4>角色列表</h4>

    {% if per.add %}
<a href="" class="btn btn-primary">添加角色</a>
{% endif %} <table class="table table-bordered table-striped"> <tbody>
{% for role in role_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ role.title }}</td> <td>
{% if per.delete %}
<a href="/roles/delete/{{ user.pk }}" class="btn btn-danger">删除</a>
{% endif %} {% if per.edit %}
<a href="/roles/edit/{{ user.pk }}" class="btn btn-warning">编辑</a>
{% endif %} </td>
</tr>
{% endfor %} </tbody>
</table> {% endblock %}

rbac---> template--->rbac---> menu.html

<div>

     {% for item in menu_permission_list %}
<p class="menu_btn"><a href="{{ item.0 }}">{{ item.1 }}</a></p>
{% endfor %} </div>

rbac---> template--->rbac---> base.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">
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<style>
*{
margin: 0;
padding: 0;
}
.header{
width: 100%;
height: 60px;
background-color: #336699;
} .menu{
background-color: bisque;
position: fixed;
top: 60px;
bottom: 0px;
left: 0px;
width: 200px;
} .content{
position: fixed;
top: 60px;
bottom: 0;
right: 0;
left: 200px;
overflow: auto;
padding: 30px; } .menu_btn{
font-size: 15px;
text-align: center;
padding: 30px 0; } .header .title{
color: white;
font-size: 18px;
margin-right: 20px;
font-weight: 100;
}
</style>
</head>
<body> <div class="header">
<p class="title pull-right">{{ user.name }}</p>
</div>
<div class="contain">
{% load my_tags %}
<div class="menu">
{% get_menu request %}
</div>
<div class="content">
{% block con %} {% endblock %} </div> </div> </body>
</html>

rbac权限(2)的更多相关文章

  1. RBAC权限管理

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

  2. phpcms中的RBAC权限系统

    PHPCMS中的RBAC权限系统主要用到了4张数据表:管理员表,角色表,菜单表,菜单权限表.先来看看数据库的数据表结构: admin 管理员表 ID 字段 类型 Null 默认 索引 额外 注释 1 ...

  3. yii2 rbac权限控制详细操作步骤

    作者:白狼 出处:http://www.manks.top/article/yii2_rbac_description本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 ...

  4. yii2 rbac权限控制之菜单menu详细教程

    作者:白狼 出处:http://www.manks.top/article/yii2_rbac_menu本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  5. yii2搭建完美后台并实现rbac权限控制实例教程

    1.安装yii2 未安装的请参考yii2史上最简单式安装教程,没有之一 或者参考yii2实战教程之详细安装步骤 已安装的请继续看下一步操作 2.配置数据库 2.1 配置数据库 修改common/con ...

  6. Yii2-admin RBAC权限管理的实现

    原文地址:http://www.open-open.com/lib/view/open1434638805348.html   http://wlzyan.blog.163.com/blog/stat ...

  7. 【转】RBAC权限管理

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

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

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

  9. ThinkPHP中:RBAC权限控制的实习步骤

    使用版本ThinkPHP3.1.3 第一步,建表及数据 第二步,建关联模型 第三步,控制器使用关联模型.配置文件 第四步,模板显示数据 第一步,建表及数据 在数据库中,建立一个companysvn数据 ...

  10. RBAC权限模型——项目实战(转)

    一.前言 权限一句话来理解就是对资源的控制,对web应用来说就是对url的控制,关于权限可以毫不客气的说几乎每个系统都会包含,只不过不同系统关于权限的应用复杂程序不一样而已,现在我们在用的权限模型基本 ...

随机推荐

  1. HTTP 协议的基本知识,包括请求流程、请求方法等

    一.什么是http协议? HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consortium)和Int ...

  2. linux下光标操作

    Ctrl+左右键    单词间跳转 Ctrl+a    跳到行首 Ctrl+e    跳到行尾 Ctrl+u    删除当前光标前的文字 Ctrl+k    删除当前光标后的文字 Ctrl+w    ...

  3. LeetCode~941.有效的山脉数组

    941.有效的山脉数组 给定一个整数数组 A,如果它是有效的山脉数组就返回 true,否则返回 false. 让我们回顾一下,如果 A 满足下述条件,那么它是一个山脉数组: A.length > ...

  4. 一文搞懂JVM内存结构+GC

    一.jvm是干什么的? 大家都知道java是跨平台语言,一次编译可以在不同操作系统上运行,怎么做到的呢,看下图: javac把写的源代码(java文件),编译成字节码(class文件),字节码部署到l ...

  5. MySQL占用CPU超过百分之100解决过程

    本文转载自: https://www.93bok.com 访问网页504 Gateway Time-out,登陆服务器查看,内存正常,CPU使用率达到了400%,因为是4核,所以到了400%,几乎全部 ...

  6. 授人以渔式解析原生JS写轮播图

    需求与分析 需求:循环无缝自动轮播五张图,按左右箭头可以手动切换图片,鼠标点击轮播图下面按钮 1 2 3 4 5会跳转到对应的第1 2 3 4 5张图片.鼠标放到轮播图的图片上时不再自动轮播并且左右箭 ...

  7. 通读Python官方文档之cgitb

    cgitb CGI脚本异常管理 源代码:Lib/cgitb.py cgitb模块为Python脚本提供了一个特殊的异常管理器.名字有点误导人,它最初设计是为了以HTML格式展示cgi脚本的大量异常信息 ...

  8. 从0开始搭建kafka客户端

    上一节,我们实现了搭建kafka集群.本节我们将从0开始,使用Java,搭建kafka客户端生产消费模型. 1.创建maven项目2.kafka producer3.kafka consumer4.结 ...

  9. 论JS函数传参时:值传递与引用传递的区别

    什么是值传递:值传递是指在调用函数时将实际参数(实参)复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 值传递的总结:也就是说,将实参复制到函数中的这个过程叫值传递 什么是 ...

  10. vue环境搭建过程中,npm权限不足问题

    今天在用git bash进行全局安装vue-cli的时候,报错: 必须以管理员权限进行安装才行.所以用cmd命令工具,点击右键命令提示符cmd--------以管理员身份运行--------cd进入到 ...