Django之管理权限
什么是權(quán)限:
誰對(duì)什么資源能做什么操作。
管理權(quán)限的實(shí)現(xiàn)有很多,這里實(shí)現(xiàn)一個(gè)最簡單的管理權(quán)限的實(shí)現(xiàn)方式:rbac?? ( role based access control )
實(shí)現(xiàn)的一個(gè)基本思路:
一張user用戶表,一張role角色表,一張permission權(quán)限表
其中,用戶與角色是多對(duì)多的關(guān)系,角色和權(quán)限是多對(duì)多的關(guān)系
用戶登錄后,通過用戶可以獲取當(dāng)前登錄人的所有權(quán)限,并設(shè)置session值(request.session["permission_list"] = 值)
然后設(shè)置中間件,在用戶登錄時(shí),設(shè)置一個(gè)白名單,如果用戶沒有登錄就去登錄,如果登錄就直接從session中取出session_list權(quán)限列表,正則匹配這個(gè)權(quán)限列表,如果匹配上,返回None,否則,返回響應(yīng)沒有訪問權(quán)限。并且用戶可以在左側(cè)菜單查看自己的訪問權(quán)限有哪些。
首先第一步:表單的設(shè)計(jì)
如果user用戶表借助了auth模塊,就直接import 這張表
在rbac這個(gè)APP中:(將管理權(quán)限設(shè)為一個(gè)獨(dú)立的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的,所以我們要借助這個(gè)后臺(tái)管理,所以要將這幾張模型表注冊(cè)
在rbac? app下的Xadmin.py中注冊(cè):
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)?
設(shè)置中間件,并且將權(quán)限列表保存在session中
在rbac下創(chuàng)建一個(gè)service的package,然后在新建一個(gè).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# 校驗(yàn)是否登錄 user_id=request.session.get("user_id")if not user_id:return redirect("/login/")# 校驗(yàn)是否擁有相應(yīng)權(quán)限 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("沒有訪問權(quán)限!")?登錄成功后,校驗(yàn)通過后,執(zhí)行取值和給session賦值:(將這個(gè)過程封裝到一個(gè).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?備注:要對(duì)篩選的結(jié)果進(jìn)行去重操作。因?yàn)橐粋€(gè)用戶會(huì)有多個(gè)role。
在用戶左側(cè)菜單展示可訪問的頁面
左側(cè)展示頁面:首先一點(diǎn),我們可以給用戶展示權(quán)限中的那些url,增刪改查中,改刪是有動(dòng)態(tài)參數(shù)的,無法展示,而添加頁面顯得有些多余,所以我們可以將所有的權(quán)限路徑中屬于展示的url過濾出來,然后加入左側(cè)菜單欄中,為了方便快捷,我們可以在這個(gè)permission權(quán)限表中,增加一個(gè)字段,叫code,我們可以將增刪改查設(shè)置為四類,然后在登錄成功,設(shè)置session值時(shí),對(duì)查這個(gè)url進(jìn)行過濾,單獨(dú)保存在一個(gè)session中,然后我們可以在相應(yīng)頁面中直接取值,即可,大大的方便了展示信息的代碼冗余和可復(fù)用性。具體的HTML頁面中,我們可以設(shè)置到一個(gè)母版中,然后用戶就可以在不同的頁面直接通過繼承就可以實(shí)現(xiàn)左側(cè)菜單欄的效果。
具體的HTML的實(shí)現(xiàn):
<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>?
轉(zhuǎn)載于:https://www.cnblogs.com/zhaopanpan/p/9178644.html
總結(jié)
以上是生活随笔為你收集整理的Django之管理权限的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2010中预处理器定义
- 下一篇: date简述