Django預設許可權機制介紹及實踐

2021-09-28 13:51:49 字數 3903 閱讀 7481

演示django版本為當前最新版本v2.2

之所以說簡單呢?主要是因為:

預設的許可權系統是基於表的控制,許可權最小粒度是表

也就是說,假如有乙個blog表,我們可以賦予使用者或組對blog表有delete的許可權,那麼使用者或組成員就可以刪除全部blog,是不能控制使用者只能刪除自己建立的blog的

如果希望使用者只能刪除自己建立的blog,不能刪除別人建立的blog,這種需求django預設的許可權管理就無法實現了,需要用到object permission物件許可權,有第三方模組實現了物件許可權,如django-guardian,你可以直接使用,或者也可以自己實現物件許可權,具體思路可參考這篇文章:django內建許可權擴充套件案例

每個model模型預設只有四個許可權,分別是新增add_、修改change_、刪除delete_、檢視view_,這些許可權記錄在permission表中,表資料如下:

預設許可權的建立是通過django的訊號signals實現的,使用了post_migrate訊號,在每次執行migrate操作時都會為新的model模型建立預設許可權,關於django的訊號signals介紹和使用可以檢視這篇文章:django使用signals監測model欄位變化傳送通知,

預設的許可權名字和描述都是英文的,且只有四個,如果你不想用預設的幾個許可權,想要自定義的話,可以這樣做:

class blog(models.model):

title = models.charfield(max_length=256, verbose_name='標題')

content = models.textfield(blank=true, null=true, verbose_name='內容')

class meta:

default_permissions = ()

permissions = (

("change_blog", "修改部落格"),

("delete_blog", "檢視部落格"),

("publish_blog", "發布部落格"),

)

default_permissions:清空缺省的許可權

permissions:設定許可權,內容是乙個巢狀的列表,列表第乙個欄位是codename,第二個欄位為name

注意:如果你使用了django預設的admin的話,建議保留4個預設許可權,可以新增新許可權

如果你用了django自帶的admin,在migrate之後就能在admin的user和group兩個表中看到新新增的許可權了

當然你也可以在程式中來新增或修改許可權

使用者許可權修改方法:

ops = user.objects.get(id=2)

ops.user_permissions.add(25, 26)

ops.user_permissions.set([26, 27])

ops.user_permissions.remove(26, 27)

ops.user_permissions.clear()

組許可權修改方法:
coffee = group.objects.get(id=1)

coffee.permissions.add(25)

coffee.permissions.set([26,27])

coffee.permissions.remove(25)

coffee.permissions.clear()

其中add為新增,set為設定,remove為移除,clear為清空,addset的區別是add會在原有許可權的基礎上加新許可權,而set會清空原有許可權設定成新的許可權,後邊的引數25,26,27可以為permission的id或者是permission物件,例如這樣也是可以的:

p = permission.objects.get(id=25)

coffee.permissions.add(p)

給組賦予許可權,組內的所有使用者會自動的擁有該組的許可權,例如使用者ops-coffee隸屬於組sresre組對blog表有修改許可權,那麼即便是沒有單獨給y37使用者分配任何許可權,他也會有對blog表的修改許可權

get_all_permissions()列出使用者的所有許可權:

>>> user.objects.get(username='ops-coffee').get_all_permissions()

get_group_permissions()列出使用者所屬組的許可權:

>>> user.objects.get(username='ops-coffee').get_group_permissions()

使用者物件可以通過has_perm方法來判斷使用者是否擁有某個許可權:

>>> user.objects.get(username='ops-coffee').has_perm('blog.change_blog')

true

>>> user.objects.get(username='ops-coffee').has_perm('blog.delete_blog')

true

可以直接在view中通過if判斷使用者許可權,例如:

def ops_coffee_view(request):

if not request.user.has_perm('blog.change_blog')

return httpresponse('403 forbidden')

為了方便,django還提供了乙個permission_required()的裝飾器,可以快速的來校驗使用者是否擁有特定的許可權,用法如下:

@permission_required(perm, login_url=none, raise_exception=false)
三個引數的意思分別是:

perm:必須有,許可權名稱,同has_perm一樣

reise_exception:非必須,當為true時,如果使用者沒有許可權,則不會跳轉到登陸頁,而是引發permissiondenied錯誤,返回403 forbidden

@permission_required('blog.change_blog', raise_exception=true)

def ops_coffee_view(request):

...

當前登陸使用者的許可權儲存在模版變數}中,可以在模版中通過if判斷使用者是否擁有相應的許可權而開放對應的內容,例如對於側邊欄選單只顯示使用者有許可權訪問的,就可以這麼寫:

專案列表

服務列表

環境列表

至此,django的預設許可權系統介紹完成,預設許可權在小型專案中能滿足大部分的需求,如果對許可權控制有更高的要求可以關注前文中介紹的django-guardian專案或自己實現

Django預設許可權機制介紹及實踐

演示django版本為當前最新版本v2.2 之所以說簡單呢?主要是因為 預設的許可權系統是基於表的控制,許可權最小粒度是表 也就是說,假如有乙個blog表,我們可以賦予使用者或組對blog表有delete的許可權,那麼使用者或組成員就可以刪除全部blog,是不能控制使用者只能刪除自己建立的blog的...

shiro預設許可權及頁面標籤

預設過濾器 10個 anon 例子 admins anon 沒有引數,表示可以匿名使用。authc 例如 admins user authc表示需要認證 登入 才能使用,沒有引數 roles 例子 admins user roles admin 引數可以寫多個,多個時必須加上引號,並且引數之間用逗號...

Django許可權設定及驗證方式

當建立乙個models,在同步到資料庫裡,django預設設定了三個許可權 就是 add,change,delete許可權nmxbhhli。但是往往有時候,根本不夠用,此時我們可以自己寫乙個指令碼,來進行許可權的設定.根據django官方文件解釋,許可權都是與models有關係的,此時.如果想設定乙...