1. 程式人生 > 程式設計 >Django許可權設定及驗證方式

Django許可權設定及驗證方式

當建立一個Models,在同步到資料庫裡,django預設設定了三個許可權 ,就是 add,change,delete許可權。但是往往有時候,根本不夠用,此時我們可以自己寫一個指令碼,來進行許可權的設定.

根據DJango官方文件解釋,許可權都是與models有關係的,此時.如果想設定一個view,對於有許可權的使用者進行放行,對於無許可權的使用者進行限制.那麼我們就可以著手來寫這個需求.

驗證許可權的方法一般有兩種,一種是用@permission_required來進行驗證,第二中是用user.has_perm()在函式裡進行驗證,通過返回的True或者False來進行下一步

同時我的稍微複雜一些,是在django中加入了第三方認證oauth2,並限制跨域訪問的資源.具體見我之前的文章.

具體步驟如下:

第一步:

設定跨域訪問資源範圍,如下:

CORS_URLS_REGEX = r'^/(o|api/oauth/).*$'
#只允許跨域訪問url為/o/....或者/api/oauth/...的資源

第二步:

寫一個設定permission指令碼,或者你自己建立一個model,然後migrate得到django預設提供的三個許可權,當然,這過於繁瑣和單一,你也可以自定義permission,在你建立的model裡新增Meta類,然後建立你的自定義permission.如下:

      class **Model():
        ....
        class Meta:
        permissions = (
          (can_read'','檢視'),(can_delete'','刪除'),)

或者,你可以自己寫一個建立permission的檔案.這裡,我的需求是根據使用者來限制是否訪問資源,直接在User上來進行permission設定,如下:

from django.contrib.auth.models import Permission,User
from django.contrib.contenttypes.models import ContentType
 
def run(codename,name):
  content_type = ContentType.objects.get_for_model(User)
  permission = Permission.objects.get_or_create(codename=codename,name=name,content_type=content_type)
  return permission

執行run即可建立指定codename的permission,這與使用者是繫結的.

第三步:

驗證許可權,最主要的有兩種方法,用裝飾器方法,或者在函式裡用has_perm/has_perms,我這裡使用裝飾器方法,當然.最開始我自己手寫了一個驗證裝飾器,後來發現,django有自帶的,也比較好用,直接在views函式錢@permission_required(perms)即可.

由於此處我用的是django的視通函式,無法直接在函式前加@permission_required(perms),需要用到如下方法,可以將函式裝飾器改為方法或類裝飾器的方法,django自帶的@method_decorator(decorator),

用法如下

class LimitView(ProtectedResourceView):
  @method_decorator(permission_required(per_list[0]))
  def get(self,request):
    ....

LimitView為我自己的檢視函式,繼承自oauth的ProtectedResourceView,作用是保護檢視函式不被授權使用者檢視.permission_required引數為使用者需要擁有的許可權,如果有,可以正常訪問,否則,會重定向到登入頁面,或者你可以在此處自己指定轉向頁面.

需要注意的是使用@permission_required(perms)時request.user需有欄位,否則會報錯.我這裡沒有登入也可以訪問授權是因為我使用了使用者允許的授權碼訪問,會直接在request中設定user欄位為該access_token對應的user.

補充知識:django 校驗使用者是否有許可權

views中判斷是否有許可權:

{% if request.user.has_perm('app.許可權名')%}
……
 {%endif%}

html中根據許可權判斷控制元件是否顯示:

{% if perms.appname.codename%}
{% endif%}

切記:要想html中變數生效,必須傳入RequestContext,views.py中必須是render(request,'xx.html',{}),這個問題糾結很久。

參考django文件:https://docs.djangoproject.com/en/2.1/topics/auth/default/#permissions

以上這篇Django許可權設定及驗證方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。