Django 之 許可權管理的外掛
阿新 • • 發佈:2018-11-15
一、功能分析: 一個成熟的web應用,對許可權的控制、管理是不可少的;對於一個web應用來說是什麼許可權? 這要從web應用的使用說起,使用者在瀏覽器輸入一個url,訪問server端,server端返回這個url下對應的資源; 所以 對於使用者來說 1個可以訪問url 就等於1個許可權 比如某人開發了一個web應用包含以下5個url,分別對於不同資源; 1、91.91p15.space/Chinese/ 2、91.91p15.space/Japanese and Korean/ 3、91p15.space/Euramerican/ 4、91p15.space/Latin America/ 5、91p15.space/African/ -------------------------------------------------------------------------------------------------------- 普通使用者:可以訪問 5 白金使用者:可以訪問 4、5、1 黃金使用者:可以訪問1、2、3、4、5 為什麼某些網站會為廣大使用者做角色劃分呢(比如 普通、會員、黑金、白金)? 因為給使用者歸類後,便於許可權的劃分、控制、管理; 所以我們把這種基於角色來做得許可權控制,稱為RBAC(Role Basic Access Control) 二、許可權管理資料庫表結構設計 1、使用者表:使用者表和角色表為多對多關係,1個使用者可以有多個角色,1個角色可以被多個使用者劃分; 2、角色表:角色表和許可權也是多對多關係,一個角色可以有多個許可權,一個許可權可以劃分給多個角色 3、選單表:用於在前端引導使用者找到自己的許可權,並可以設定多級選單對使用者許可權進行劃分;所以許可權表和選單表是1對多關係; 由於需要構建多級選單,並且擁有巢狀關係,所以選單表自引用; 啟發:一般設計包含層級結構巢狀,切巢狀的層級無法預測的表結構使用自關聯;(表1外來鍵-----》表2----》外來鍵表3是行不通的,因為無法預測巢狀層級的深度) 例如:多級評論(無法預測,評論樹的深度)
三、modal.py資料模型
表結構
from django.db import models from django.db import models class Menu(models.Model): ''' 選單表''' caption=models.CharField(max_length=32) parent=models.ForeignKey('Menu',null=True,blank=True) #自關聯 def __str__(self): caption_list = [self.caption,] p=self.parent while p: #如果有父級選單,一直向上尋找 caption_list.insert(0,p.caption) p=p.parent return "-".join(caption_list) class Permission(models.Model): '''許可權表''' title = models.CharField(max_length=64) url = models.CharField(max_length=255) menu = models.ForeignKey('Menu', null=True, blank=True)#和選單是1對多關係 def __str__(self): return '許可權名稱: %s--------許可權所在選單 %s'% (self.title,self.menu) class Role(models.Model): '''角色表''' rolename=models.CharField(max_length=32) permission=models.ManyToManyField('Permission') def __str__(self): return '角色: %s--------許可權 %s'% (self.rolename,self.permission) class UserInfo(models.Model): '''使用者表''' name=models.CharField(max_length=32) pwd=models.CharField(max_length=64) rule=models.ManyToManyField('Role') def __str__(self): return self.name
四 , 許可權初始化設定,中間鍵獲取,判斷,生成許可權選單:
當用戶登入之後獲取到使用者名稱,密碼查詢使用者表查詢得到角色,許可權資訊,寫入到當前使用者的session 中
用session來儲存使用者的許可權資訊;
寫入session之後每次請求到這裡 ,可以通過django的中間鍵來判斷使用者的許可權;
1,使用者首次登陸,初始時該使用者許可權,寫入session;
View Code from app02 import models from app02.service import init_session from django.conf import settings import re def login(reqeust): if reqeust.method == 'GET': return render(reqeust, 'login.html') else: user = reqeust.POST.get('user') pwd = reqeust.POST.get('pwd') user_obj = models.UserInfo.objects.filter(name=user, pwd=pwd).first() if user: # init_session(reqeust,user_obj) init_session.per(reqeust,user_obj)#使用者首次登入初始化使用者許可權資訊 return redirect('/index/') else: return render(reqeust, 'login.html') def index(request): return HttpResponse('INDEX') def test_query(request): return render(request,'test.html')View Code