自定義組件的權限
我們的組件已經寫完了,但是當我們的其他項目要用到這個組件的時候,就需要把這個組件整個拿過去,所以我們應該把templates和stark放在一起。
直接將templates拖到stark組件下。
這樣做也是可以的,不會報錯,是因為settings中的templates的配置。
django查找模板文件順序
(1) 先按照settings中配置的templates的DIR的指定路徑查找
(2) 如果找不到,繼續按settings中的app註冊順訊一次查找,每一個app下的templates文件,如果再找不到,報錯
然後我們來了解一下什麽是權限,當我們用url訪問權限的時候,就可以把url當成是權限,只要有這個url就有權限。
rbac (role based access control)。
我們另起一個項目叫做crm,在則各項目中,我們要用到自己寫的組件。我們直接拷貝過來stark組件。
我們要寫權限,權限的所有功能,我們也可以放在一個app下,新建一個app,叫rbac,寫我們的權限。
在rbac中我們要建一些用戶權限的表。在rbac中的model中創建這幾張表。先把rbac的app添加進setting中
from django.db import models # Create your models here. class User(models.Model): user=models.CharField(max_length=32) pwd=models.CharField(max_length=32) roles=models.ManyToManyField("Role") def __str__(self): return self.user class Role(models.Model): title=models.CharField(max_length=32) permissions=models.ManyToManyField("Permission") def __str__(self): return self.title classPermission(models.Model): url=models.CharField(max_length=128) title = models.CharField(max_length=32) code=models.CharField(max_length=32,default="list") def __str__(self): return self.title
然後執行數據庫遷移的兩條命令。配好url後,url(r‘^stark/‘, sites.site.urls), 就能夠訪問stark了。
我們先要理解清楚這幾個app的功能,rbac是用來寫權限的,而app01是用來寫功能的,stark是我們寫的組建。
這時候我們在app01下簡單見幾張表,加入幾條數據(利用sark組件進行添加)。
app01下的model
from django.db import models # Create your models here. class School(models.Model): title = models.CharField(max_length=128) def __str__(self): return self.title class Order(models.Model): title = models.CharField(max_length=32) num = models.IntegerField(max_length=32) def __str__(self): return self.title
這樣我們就能用stark組件對app01下的這幾張表進行增刪改查了。
這時候就涉及到權限問題了。因為有些角色不是擁有所有的功能,這時候就需要我們寫權限了。
我們先把用戶訪問的url添加到rbac中,錄入權限
但是我們在錄入編輯和刪除權限url的時候應該使用正則來匹配,因為當用戶 擁有 訪問 編輯學校的權限,而在寫權限的時候不能把學校的id寫死。
這樣權限就簡單的寫完了,然後給rbac添加角色。
這時候角色和對應的權限都添加好了。
然後添加user用戶
接下來就是用戶登錄後獲取用戶登錄人的權限了。
用戶登錄屬於業務邏輯,所以就在app01下的views中寫。
這樣用戶登錄之後,就可以進入stark組件訪問了,但是這不是我們想要的,因為現在可以訪問所有的權限,
接下來就是做一些用戶的控制權限了。那這個怎麽做呢?我們可以在用戶訪問的時候進行判斷一下,如果這個用戶的角色有這個url,就說明有權限訪問。否則就沒有權限訪問。
那我們就想一想,這些代碼應該寫在哪?是不是每次用戶登錄之後就應該session中有沒有權限的url,所以我們應該把他放在中間件中。
在rbac建一個package,在裏面建一個py文件,用來寫我們的中間件。
記住要在setting中 MIDDLEWARE 加上咱們的中間件 ‘rbac.service.rbac_middle.PermissionMiddleware‘,
但這時候會報一個錯誤,
這是為什麽呢?因為我們沒有登陸,所以當我們訪問權限的時候會先走中間件,走到中間件就會重定向/login/,這又是一次請求,又會走中間件,這樣一直循環。
所以我們在中間件中設置一個白名單:
判斷當前的路徑是否在白名單內,如果在就放行,如果不在就重定向到login頁面。 這樣用戶登錄的認證就做好了
接下來就是權限認證了
之前我們不是把登陸人的權限url存在session中了嗎?
這樣似乎就寫完了。但是,但我們訪問編輯和刪除的權限的時候卻不能訪問了,
因為在我們訪問的編輯和刪除權限的時候:
我們應該用正則:
還有一個小問題,就是但我們訪問admin的時候,如果沒有登陸admin會自動跳轉到/admin/login/?next=/admin/但是,這時候走中間件就會被攔截下來,所以:
這時候訪問admin就能夠看到了。
這樣權限訪問就可以了。
接下來就是權限菜單的顯示。就是在左側顯示一個當前登陸人的權限菜單
在頁面中渲染:
自定義組件的權限