什么是权限:

  谁对什么资源能做什么操作。

管理权限的实现有很多,这里实现一个最简单的管理权限的实现方式:rbac   ( role based access control )

实现的一个基本思路:

  一张user用户表,一张role角色表,一张permission权限表

其中,用户与角色是多对多的关系,角色和权限是多对多的关系

  用户登录后,通过用户可以获取当前登录人的所有权限,并设置session值(request.session["permission_list"] = 值)

  然后设置中间件,在用户登录时,设置一个白名单,如果用户没有登录就去登录,如果登录就直接从session中取出session_list权限列表,正则匹配这个权限列表,如果匹配上,返回None,否则,返回响应没有访问权限。并且用户可以在左侧菜单查看自己的访问权限有哪些。

首先第一步:表单的设计

如果user用户表借助了auth模块,就直接import 这张表

在rbac这个APP中:(将管理权限设为一个独立的app(组件))  models.py

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class User(models.Model):
  6. name=models.CharField(max_length=32)
  7. pwd=models.CharField(max_length=32)
  8. roles=models.ManyToManyField("Role")
  9. def __str__(self):
  10. return self.name
  11.  
  12. class Role(models.Model):
  13. title=models.CharField(max_length=32)
  14. permissions=models.ManyToManyField("Permission")
  15. def __str__(self):
  16. return self.title
  17.  
  18. class Permission(models.Model):
  19. title = models.CharField(max_length=32)
  20. url = models.CharField(max_length=32)
  21.  
  22. code=models.CharField(max_length=32,default="list")
  23.  
  24. def __str__(self):
  25. return self.title

由于是基于Xadmin的,所以我们要借助这个后台管理,所以要将这几张模型表注册

在rbac  app下的Xadmin.py中注册:

  1. from Xadmin.service.Xadmin import site,ModelXadmin
  2. from .models import User
  3. from .models import Role
  4. from .models import Permission
  5.  
  6. site.register(User)
  7. site.register(Role)
  8.  
  9. class PermisssionConfig(ModelXadmin):
  10. list_display = ["id","title","url","code"]
  11.  
  12. site.register(Permission,PermisssionConfig)

设置中间件,并且将权限列表保存在session中

在rbac下创建一个service的package,然后在新建一个.py文件,用于放置中间件的逻辑。

  1. from django.utils.deprecation import MiddlewareMixin
  2. from django.shortcuts import redirect,HttpResponse,render
  3. import re
  4.  
  5. class ValidPermission(MiddlewareMixin):
  6.  
  7. def process_request(self,request):
  8.  
  9. print("path",request.path)
  10. current_path=request.path
  11.  
  12. white_list=["/login/","/reg/","/index/","/admin/*"]
  13.  
  14. for ignore_url in white_list:
  15. ret=re.search(ignore_url,current_path)
  16. if ret:
  17. return None
  18.  
  19. # 校验是否登录
  20.  
  21. user_id=request.session.get("user_id")
  22. if not user_id:
  23. return redirect("/login/")
  24.  
  25. # 校验是否拥有相应权限
  26.  
  27. permission_list=request.session.get("permission_list")
  28. print("permission_list",permission_list)
  29.  
  30. for permission in permission_list:
  31. permission="^%s$"%permission
  32. ret=re.search(permission,current_path)
  33. if ret:
  34. return None
  35.  
  36. return HttpResponse("没有访问权限!")

登录成功后,校验通过后,执行取值和给session赋值:(将这个过程封装到一个.py文件中,哪儿需要直接import即可)

  1. def init_session_permission(user,request):
  2.  
  3. permissions = user.roles.all().values("permissions__url","permissions__code","permissions__title").distinct()
  4. print("permissions",permissions)
  5. permission_list = []
  6. menu_permission_dict={}
  7. for permission in permissions:
  8. permission_list.append(permission.get("permissions__url"))
  9. if permission.get("permissions__code")=="list":
  10. menu_permission_dict[permission.get("permissions__title")]=permission.get("permissions__url")
  11.  
  12. request.session["permission_list"] = permission_list
  13. request.session["menu_permission_dict"] = menu_permission_dict

备注:要对筛选的结果进行去重操作。因为一个用户会有多个role。

在用户左侧菜单展示可访问的页面

左侧展示页面:首先一点,我们可以给用户展示权限中的那些url,增删改查中,改删是有动态参数的,无法展示,而添加页面显得有些多余,所以我们可以将所有的权限路径中属于展示的url过滤出来,然后加入左侧菜单栏中,为了方便快捷,我们可以在这个permission权限表中,增加一个字段,叫code,我们可以将增删改查设置为四类,然后在登录成功,设置session值时,对查这个url进行过滤,单独保存在一个session中,然后我们可以在相应页面中直接取值,即可,大大的方便了展示信息的代码冗余和可复用性。具体的HTML页面中,我们可以设置到一个母版中,然后用户就可以在不同的页面直接通过继承就可以实现左侧菜单栏的效果。

具体的HTML的实现:

  1. <div class="menu">
  2. <div class="panel panel-danger">
  3. <div class="panel-heading">Panel heading without title</div>
  4. <div class="panel-body">
  5. {% for title,url in request.session.menu_permission_dict.items %}
  6. <p><a href="{{ url }}">{{ title }}</a></p>
  7. {% endfor %}
  8.  
  9. </div>
  10. </div>
  11. </div>

Django之管理权限的更多相关文章

  1. Django实现Rbac权限管理

    权限管理 权限管理是根据不同的用户有相应的权限功能,通常用到的权限管理理念Rbac. Rbac 基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问, ...

  2. Django项目实践4 - Django网站管理(后台管理员)

    http://blog.csdn.net/pipisorry/article/details/45079751 上篇:Django项目实践3 - Django模型 Introduction 对于某一类 ...

  3. Django项目实践4 - Django站点管理(后台管理员)

    http://blog.csdn.net/pipisorry/article/details/45079751 上篇:Django项目实践3 - Django模型 Introduction 对于某一类 ...

  4. Django中用户权限模块

    Django中用户权限模块 1 auth模块 auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. auth可以和admin模块配合使用, 快速建立网站的管理系 ...

  5. Django内置权限扩展案例

    当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统,Django内置权限系统基于model层做控制,新的model创建后会默认新建 ...

  6. django 用户管理相关的表

    Django 用户管理相关的表: create table django_content_type ( /* 内容类型表 */ id ) not null auto_increment, app_la ...

  7. django自带权限机制

    1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发,理清Django权限机制是 ...

  8. Django笔记 —— Admin(Django站点管理界面)

    最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...

  9. django后台管理-admin

    0922自我总结 django后台管理-admin 一.模型注册 admin.py 注册方式一: #在对于注册的app中的admin文件中导入模型然后注册模型 admin.site.register( ...

随机推荐

  1. 最小生成树-----Prim算法与Kruskal算法(未完

    生成树(spanning tree):无向联通图的某个子图中,任意两个顶点互相都联通并且形成了一棵树,那么这棵树就叫做生成树. 最小生成树(MST,minimum spanning tree):如果为 ...

  2. python基础----内置函数----匿名函数(lambda)

    Python3版本所有的内置函数: 1. abs() 获取绝对值 >>> abs(-) >>> abs() >>> abs() >>& ...

  3. 在 Xamarin.Forms 实现页面全屏显示

    NavigationPage.SetHasNavigationBar(this, false); 或者 <ContentPage ... NavigationPage.HasNavigation ...

  4. Virtual Box虚拟机下CentOS网络设置

    VirtualBox中有4中网络连接方式: a. NAT                          网络地址转换模式(Network Address Translation)b. Bridge ...

  5. thinkphp常见问题

    1.数据库查询中execute和query方法的区别 tp中execute()和query()方法都可以在参数里直接输入sql语句. 但是不同的是execute()通常用来执行insert或者upda ...

  6. 前端PHP入门-006-表达式和运算符

    算术运算 概念 算数运算符,就是大家小学所学绝大多数知识: 符号 描述 示例 + 加号 x+" role="presentation" style="posit ...

  7. 2-sat Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) D

    http://codeforces.com/contest/782/problem/D 题意: 每个队有两种队名,问有没有满足以下两个条件的命名方法: ①任意两个队的名字不相同. ②若某个队 A 选用 ...

  8. 如何在AngularJS渲染后再加载JS

    http://www.itnose.net/detail/6100484.html app.directive('repeatDone', function () { return function ...

  9. Flex布局(伸缩盒布局)

    Flexible Box是什么?Flexible意为可伸缩的,Box意为盒子,可以理解为一种新式的盒模型——伸缩盒模型.由CSS3规范提出,这是在原有的大家非常熟悉的block, inline-blo ...

  10. mysql-front导入数据失败:“在多字节的目标代码页中,没有此 Unicode 字符可以映射到的字符”

    mysql-front导入sql文件失败,弹出框显示如下: 解决方法:在选择文件时,选择合适的字符集即可 参考:http://www.th7.cn/db/mysql/201604/185149.sht ...