1. 程式人生 > >Django 之 許可權管理的外掛

Django 之 許可權管理的外掛

  

一、功能分析:
一個成熟的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