1. 程式人生 > >自定義組件的權限

自定義組件的權限

ont alt access school 自定義組件 添加 user 為我 當前

我們的組件已經寫完了,但是當我們的其他項目要用到這個組件的時候,就需要把這個組件整個拿過去,所以我們應該把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 class
Permission(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就能夠看到了。

這樣權限訪問就可以了。

接下來就是權限菜單的顯示。就是在左側顯示一個當前登陸人的權限菜單

技術分享圖片

在頁面中渲染:

技術分享圖片

自定義組件的權限