Django之管理权限
什么是權限:
誰對什么資源能做什么操作。
管理權限的實現有很多,這里實現一個最簡單的管理權限的實現方式: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
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("Role")def __str__(self):return self.nameclass Role(models.Model):title=models.CharField(max_length=32)permissions=models.ManyToManyField("Permission")def __str__(self):return self.titleclass Permission(models.Model):title = models.CharField(max_length=32)url = models.CharField(max_length=32)code=models.CharField(max_length=32,default="list")def __str__(self):return self.title?
?
由于是基于Xadmin的,所以我們要借助這個后臺管理,所以要將這幾張模型表注冊
在rbac? app下的Xadmin.py中注冊:
from Xadmin.service.Xadmin import site,ModelXadmin from .models import User from .models import Role from .models import Permissionsite.register(User) site.register(Role)class PermisssionConfig(ModelXadmin):list_display = ["id","title","url","code"]site.register(Permission,PermisssionConfig)?
設置中間件,并且將權限列表保存在session中
在rbac下創建一個service的package,然后在新建一個.py文件,用于放置中間件的邏輯。
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import redirect,HttpResponse,render import reclass ValidPermission(MiddlewareMixin):def process_request(self,request):print("path",request.path)current_path=request.pathwhite_list=["/login/","/reg/","/index/","/admin/*"]for ignore_url in white_list:ret=re.search(ignore_url,current_path)if ret:return None# 校驗是否登錄 user_id=request.session.get("user_id")if not user_id:return redirect("/login/")# 校驗是否擁有相應權限 permission_list=request.session.get("permission_list")print("permission_list",permission_list)for permission in permission_list:permission="^%s$"%permissionret=re.search(permission,current_path)if ret:return Nonereturn HttpResponse("沒有訪問權限!")?登錄成功后,校驗通過后,執行取值和給session賦值:(將這個過程封裝到一個.py文件中,哪兒需要直接import即可)
def init_session_permission(user,request):permissions = user.roles.all().values("permissions__url","permissions__code","permissions__title").distinct()print("permissions",permissions)permission_list = []menu_permission_dict={}for permission in permissions:permission_list.append(permission.get("permissions__url"))if permission.get("permissions__code")=="list":menu_permission_dict[permission.get("permissions__title")]=permission.get("permissions__url")request.session["permission_list"] = permission_listrequest.session["menu_permission_dict"] = menu_permission_dict?備注:要對篩選的結果進行去重操作。因為一個用戶會有多個role。
在用戶左側菜單展示可訪問的頁面
左側展示頁面:首先一點,我們可以給用戶展示權限中的那些url,增刪改查中,改刪是有動態參數的,無法展示,而添加頁面顯得有些多余,所以我們可以將所有的權限路徑中屬于展示的url過濾出來,然后加入左側菜單欄中,為了方便快捷,我們可以在這個permission權限表中,增加一個字段,叫code,我們可以將增刪改查設置為四類,然后在登錄成功,設置session值時,對查這個url進行過濾,單獨保存在一個session中,然后我們可以在相應頁面中直接取值,即可,大大的方便了展示信息的代碼冗余和可復用性。具體的HTML頁面中,我們可以設置到一個母版中,然后用戶就可以在不同的頁面直接通過繼承就可以實現左側菜單欄的效果。
具體的HTML的實現:
<div class="menu"><div class="panel panel-danger"><div class="panel-heading">Panel heading without title</div><div class="panel-body">{% for title,url in request.session.menu_permission_dict.items %}<p><a href="{{ url }}">{{ title }}</a></p>{% endfor %}</div></div></div>?
轉載于:https://www.cnblogs.com/zhaopanpan/p/9178644.html
總結
以上是生活随笔為你收集整理的Django之管理权限的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2010中预处理器定义
- 下一篇: date简述