**记住每一个url都是一个权限**

注册

可插拔试的权限,可以先写其他的逻辑,在最后再把权限加上

将rbac组件拷贝到项目上,注册项目

修改表结构

将写好的用户表对rbac的User表进行一对一的关系建立,修改完成后做数据库迁移:

记住null等于true..后面再添加用户

将权限组件放在中间件上

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.service.rbac.ValidPermission',
]

写登录的视图函数:

切记1.将user_id写入session中

  2.登录成功之后需要注册权限

        if user:
request.session['user_id']=user.id initial_session(user,request)

在所展示的页面上的html里添加菜单:

{% load my_tags %}
<div class="menu">
{% get_menu request %}
</div>
<div class="content">

将权限的数据录入到数据库中

注册权限的代码逻辑:

def initial_session(user,request):
'''注册权限和菜单权限'''
permissions = user.roles.all().values("permissions__url","permissions__group_id","permissions__action").distinct()
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"]) request.session['permission_dict']=permission_dict # 注册菜单权限
permissions = user.roles.all().values("permissions__url","permissions__action","permissions__title").distinct() menu_permission_list=[]
for item in permissions:
if item["permissions__action"]=="list":
menu_permission_list.append((item["permissions__url"],item["permissions__title"])) request.session["menu_permission_list"]=menu_permission_list

权限中间件:

from django.shortcuts import  HttpResponse,redirect
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_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:
request.actions=item['actions']
return None return HttpResponse("没有访问权限!")
request.actions=item['actions'] 可以在相应的视图中,进行判断是否要显示增加或者删除按钮等操作

Django之权限用法的更多相关文章

  1. Django万能权限框架组件

    业务场景分析 假设我们在开发一个培训机构的 客户关系管理系统,系统分客户管理.学员管理.教学管理3个大模块,每个模块大体功能如下 客户管理 销售人员可以录入客户信息,对客户进行跟踪,为客户办理报名手续 ...

  2. [Django]用户权限学习系列之权限管理界面实现

    本系列前三章: http://www.cnblogs.com/CQ-LQJ/p/5604331.htmlPermission权限基本操作指令 http://www.cnblogs.com/CQ-LQJ ...

  3. 巨蟒django之权限6: 权限控制表设计&&登录权限

    1.权限控制表设计 内容 . 什么是权限? . 为什么要有权限? 不同用户拥有不同的功能 . 在web开发中,什么是权限? url 代表 权限 . 开发一个权限的组件,为什么要开发组件? . 表结构的 ...

  4. Django默认权限机制介绍及实践

    演示Django版本为当前最新版本v2.2 当Django配置文件中的INSTALL_APPS包含了django.contrib.auth时,就默认启用了一个简单的权限系统,提供了为用户或组分配权限的 ...

  5. [Django]用户权限学习系列之设计自有权限管理系统设计思路

    若在阅读本片文章遇到权限操作问题,请查看本系列的前两章! http://www.cnblogs.com/CQ-LQJ/p/5609690.html和http://www.cnblogs.com/CQ- ...

  6. [Django]用户权限学习系列之User权限基本操作指令

    针对Django 后台自带的用户管理系统,虽说感觉还可以,但是为了方便用户一些操作,特别设计自定义的用户权限管理系统. 在制作权限页面前,首先需要了解权限和用户配置权限的指令,上章讲到权限的添加,删除 ...

  7. [Django]用户权限学习系列之Permission权限基本操作指令

    若需建立py文件进行测试,则在文件开始加入以下代码即可 #coding:utf-8 import os os.environ.setdefault("DJANGO_SETTINGS_MODU ...

  8. 【django之权限组件】

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

  9. django用户权限操作

    第一步:创建数据库和超级管理员,为了比较方便使用(里面有些的是没用的),额外新增 chioces , per_method , argument_list # 用户权限# 建立一个权限表,将映射关系存 ...

随机推荐

  1. 2017.9.15 mybatis批量插入后实现主键回填

    参考来自:mybatis mysql 批量insert 返回主键 注意:必须要在mybatis3.3.1及其以上才能实现. 1.service List branchEntryList = (Arra ...

  2. Word文档打不开怎么办

    目前一些主流的办公软件给大家日常工作带来了很大便利,比如:Microsoft Office或金山WPS!我们在愉快地使用它们的同时,多少也遇到了一些让人尴尬或头疼的问题,比如:精心制作的文档,突然打不 ...

  3. S5:桥接模式 Bridge

    将抽象的部分与实现的部分分离,使它们都可以独立变化.抽象与实现的分离,指的是抽象类和派生类用来实现自己的对象.实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来,让他们独立变 ...

  4. 模仿 BootstrapValidator 自制 模块化 表单验证

    index.html : <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  5. 【Java】Java_20 Scanner获取键盘输入

    使用Scanner类可以很方便的获取用户的键盘输入,Scanner是一个基于正则表达式子的文本扫描器,他可以从文件.输入流.字符串中解析出基本类型值和字符串值. 例子示意: package com.o ...

  6. mysql返回记录的ROWNUM(转)

      set @rownum = 0; select (@rownum := @rownum + 1) as rownum, name, scores from user order by scores ...

  7. DbVisualizer出现下列错误:Could not read XML file

    数据库连接工具对于我们软件测试工程师来说是日常的工具,一旦关键时刻报些莫名的错误,相信大家很是苦恼.当然,各公司数据库连接工具各异,像DbVisualizer.PLsql.sqldeveloper.T ...

  8. C#开发--FTP操作方法管理

    1.整理简化了下C#的ftp操作,方便使用    1.支持创建多级目录    2.批量删除    3.整个目录上传    4.整个目录删除    5.整个目录下载 2.调用方法展示, var ftp ...

  9. asp.net core mvc视频A:笔记3-2.表单使用

    页面上呈现表单的两种方式 新建项目,增加Test控制器,增加Index视图 方式一:HTML构建表单 运行 方式二:HTML 运行 数据绑定 处理方法 调用结果 登录后返回值 默认值绑定 方式一: 控 ...

  10. windows 网站迁移到linux

    从windows迁移网站到linux 发现乱码 出现这种情况的原因为两种操作系统的中文压缩方式不同,在windows环境中中文一般为gbk,而在linux环境中为utf8,这就导致了在windows下 ...