亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Django 權(quán)限管理(permissions)與用戶組(group)詳解

 更新時(shí)間:2020年11月30日 10:23:34   作者:大江狗  
這篇文章主要介紹了Django 權(quán)限管理(permissions)與用戶組(group)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

如果你只是利用Django開(kāi)發(fā)個(gè)博客,大部分用戶只是閱讀你的文章而已,你可能根本用不到本節(jié)內(nèi)容。但是如果你想開(kāi)發(fā)一個(gè)內(nèi)容管理系統(tǒng),或用戶管理系統(tǒng),你必需對(duì)用戶的權(quán)限進(jìn)行管理和控制。Django自帶的權(quán)限機(jī)制(permissions)與用戶組(group)可以讓我們很方便地對(duì)用戶權(quán)限進(jìn)行管理。小編我今天就嘗試以淺顯的語(yǔ)言來(lái)講解下如何使用Django自帶的權(quán)限管理機(jī)制。

什么是權(quán)限?

權(quán)限是能夠約束用戶行為和控制頁(yè)面顯示內(nèi)容的一種機(jī)制。一個(gè)完整的權(quán)限應(yīng)該包含3個(gè)要素: 用戶,對(duì)象和權(quán)限,即什么用戶對(duì)什么對(duì)象有什么樣的權(quán)限。

假設(shè)我們有一個(gè)應(yīng)用叫blog,其包含一個(gè)叫Article(文章)的模型。那么一個(gè)超級(jí)用戶一般會(huì)有如下4種權(quán)限,而一個(gè)普通用戶可能只有1種或某幾種權(quán)限,比如只能查看文章,或者能查看和創(chuàng)建文章但是不能修改和刪除。

  • 查看文章(view)
  • 創(chuàng)建文章(add)
  • 更改文章(change)
  • 刪除文章(delete)

我們?cè)贒jango的admin中是可以很輕易地給用戶分配權(quán)限的。

Django Admin中的權(quán)限分配

Django中的用戶權(quán)限分配,主要通過(guò)Django自帶的Admin界面進(jìn)行維護(hù)的。當(dāng)你編輯某個(gè)user信息時(shí), 你可以很輕易地在User permissions欄為其設(shè)置對(duì)某些模型查看, 增加、更改和刪除的權(quán)限(如下圖所示)。 

Django的權(quán)限permission本質(zhì)是djang.contrib.auth中的一個(gè)模型, 其與User的user_permissions字段是多對(duì)多的關(guān)系。當(dāng)我們?cè)贗NSTALLED_APP里添加好auth應(yīng)用之后,Django就會(huì)為每一個(gè)你安裝的app中的模型(Model)自動(dòng)創(chuàng)建4個(gè)可選的權(quán)限:view, add,change和delete。(注: Django 2.0前沒(méi)有view權(quán)限)。隨后你可以通過(guò)admin將這些權(quán)限分配給不同用戶。

查看用戶的權(quán)限

權(quán)限名一般有app名(app_label),權(quán)限動(dòng)作和模型名組成。以blog應(yīng)用為例,Django為Article模型自動(dòng)創(chuàng)建的4個(gè)可選權(quán)限名分別為:

  • 查看文章(view): blog.view_article
  • 創(chuàng)建文章(add): blog.add_article
  • 更改文章(change): blog.change_article
  • 刪除文章(delete): blog.delete_article

在前例中,我們已經(jīng)通過(guò)Admin給用戶A(user_A)分配了創(chuàng)建文章和修改文章的權(quán)限。我們現(xiàn)在可以使用user.has_perm()方法來(lái)判斷用戶是否已經(jīng)擁有相應(yīng)權(quán)限。下例中應(yīng)該返回True。

  • user_A.has_perm('blog.add_article')
  • user_A.has_perm('blog.change_article')

如果我們要查看某個(gè)用戶所在用戶組的權(quán)限或某個(gè)用戶的所有權(quán)限(包括從用戶組獲得的權(quán)限),我們可以使用get_group_permissions()和get_all_permissions()方法。

  • user_A.get_group_permissions()
  • user_A.get_all_permissions()

手動(dòng)定義和分配權(quán)限(Permissions

有時(shí)django創(chuàng)建的4種可選權(quán)限滿足不了我們的要求,這時(shí)我們需要自定義權(quán)限。實(shí)現(xiàn)方法主要有兩種。下面我們將分別使用2種方法給Article模型新增了兩個(gè)權(quán)限,一個(gè)是publish_article, 一個(gè)是comment_article。

方法1. 在Model的meta屬性中添加permissions。

class Article(models.Model):
  ...
  class Meta:
    permissions = (
      ("publish_article", "Can publish article"),
      ("comment_article", "Can comment article"),
    )

方法2. 使用ContentType程序化創(chuàng)建permissions。

from blog.models import Article
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
 
content_type = ContentType.objects.get_for_model(article)
permission1 = Permission.objects.create(
  codename='publish_article',
  name='Can publish articles',
  content_type=content_type,
)
 
permission2 = Permission.objects.create(
  codename='comment_article',
  name='Can comment articles',
  content_type=content_type,
)

當(dāng)你使用python manage.py migrate命令后,你會(huì)發(fā)現(xiàn)Django admin的user permissions欄又多了兩個(gè)可選權(quán)限。

如果你不希望總是通過(guò)admin來(lái)給用戶設(shè)置權(quán)限,你還可以在代碼里手動(dòng)給用戶分配權(quán)限。這里也有兩種實(shí)現(xiàn)方法。

方法1. 使用user.user_permissions.add()方法

myuser.user_permissions.add(permission1, permission2, ...)

方法2. 通過(guò)user所在的用戶組(group)給用戶增加權(quán)限

mygroup.permissions.add(permission1, permission2, ...)

如果你希望在代碼中移除一個(gè)用戶的權(quán)限,你可以使用remove或clear方法。

myuser.user_permissions.remove(permission, permission, ...)
myuser.user_permissions.clear()

注意權(quán)限的緩存機(jī)制

Django會(huì)緩存每個(gè)用戶對(duì)象,包括其權(quán)限user_permissions。當(dāng)你在代碼中手動(dòng)改變一個(gè)用戶的權(quán)限后,你必須重新獲取該用戶對(duì)象,才能獲取最新的權(quán)限。

比如下例在代碼中給用戶手動(dòng)增加了change_blogpost的權(quán)限,如果不重新載入用戶,那么將顯示用戶還是沒(méi)有change_blogpost的權(quán)限。

from django.contrib.auth.models import Permission, User
from django.contrib.contenttypes.models import ContentType
from django.shortcuts import get_object_or_404
 
from myapp.models import BlogPost
 
def user_gains_perms(request, user_id):
  user = get_object_or_404(User, pk=user_id)
  # any permission check will cache the current set of permissions
  user.has_perm('myapp.change_blogpost') 
 
  content_type = ContentType.objects.get_for_model(BlogPost)
  permission = Permission.objects.get(
    codename='change_blogpost',
    content_type=content_type,
  )
  user.user_permissions.add(permission)
 
  # Checking the cached permission set
  user.has_perm('myapp.change_blogpost') # False
 
  # Request new instance of User
  # Be aware that user.refresh_from_db() won't clear the cache.
  user = get_object_or_404(User, pk=user_id)
 
  # Permission cache is repopulated from the database
  user.has_perm('myapp.change_blogpost') # True

用戶權(quán)限的驗(yàn)證(Validation)

我們前面講解了用戶權(quán)限的創(chuàng)建和設(shè)置,現(xiàn)在我們將進(jìn)入關(guān)鍵一環(huán),用戶權(quán)限的驗(yàn)證。我們?cè)诜峙浜脵?quán)限后,我們還需要在視圖views.py和模板里驗(yàn)證用戶是否具有相應(yīng)的權(quán)限,否則前面設(shè)置的權(quán)限形同虛設(shè)。這就是為什么我們前面很多django實(shí)戰(zhàn)案例里,沒(méi)有給用戶分配某個(gè)模型的add和change權(quán)限,用戶還是還能創(chuàng)建和編輯對(duì)象的原因。

1. 視圖中驗(yàn)證

在視圖中你當(dāng)然可以使用user.has_perm方法對(duì)一個(gè)用戶的權(quán)限進(jìn)行直接驗(yàn)證。當(dāng)然一個(gè)更好的方法是使用@permission_required這個(gè)裝飾器。

permission_required(perm, login_url=None, raise_exception=False)

你如果指定了login_url, 用戶會(huì)被要求先登錄。如果你設(shè)置了raise_exception=True, 會(huì)直接返回403無(wú)權(quán)限的錯(cuò)誤,而不會(huì)跳轉(zhuǎn)到登錄頁(yè)面。使用方法如下所示:

from django.contrib.auth.decorators import permission_required
 
@permission_required('polls.can_vote')
def my_view(request):
  ...

如果你使用基于類(lèi)的視圖(Class Based View), 而不是函數(shù)視圖,你需要繼承PermissionRequiredMixin這個(gè)類(lèi),如下所示:

from django.contrib.auth.mixins import PermissionRequiredMixin
 
class MyView(PermissionRequiredMixin, View):
  permission_required = 'polls.can_vote'
  # Or multiple of permissions:
  permission_required = ('polls.can_open', 'polls.can_edit')

2. 模板中驗(yàn)證

在模板中驗(yàn)證用戶權(quán)限主要需要學(xué)會(huì)使用perms這個(gè)全局變量。perms對(duì)當(dāng)前用戶的user.has_module_perms和user.has_perm方法進(jìn)行了封裝。當(dāng)我們需要判斷當(dāng)前用戶是否擁有blog應(yīng)用下的所有權(quán)限時(shí),我們可以使用:

{{ perms.blog }}

我們?nèi)绻袛喈?dāng)前用戶是否擁有blog應(yīng)用下發(fā)表文章討論的權(quán)限,則使用:

{{ perms.blog.comment_article }}

這樣結(jié)合template的if標(biāo)簽,我們可以通過(guò)判斷當(dāng)前用戶所具有的權(quán)限,顯示不同的內(nèi)容了.

{% if blog.article %}
  <p>You have permission to do something in this blog app.</p>
  {% if perms.blog.add_article %}
    <p>You can add articles.</p>
  {% endif %}
  {% if perms.blog.comment_article %}
    <p>You can comment articles!</p>
  {% endif %}
{% else %}
  <p>You don't have permission to do anything in the blog app.</p>
{% endif %}

用戶組(Group)

 用戶組(Group)和User模型是多對(duì)多的關(guān)系。其作用在權(quán)限控制時(shí)可以批量對(duì)用戶的權(quán)限進(jìn)行管理和分配,而不用一個(gè)一個(gè)用戶分配,節(jié)省工作量。將一個(gè)用戶加入到一個(gè)Group中后,該用戶就擁有了該Group所分配的所有權(quán)限。例如,如果一個(gè)用戶組editors有權(quán)限change_article, 那么所有屬于editors組的用戶都會(huì)有這個(gè)權(quán)限。

將用戶添加到用戶組或者給用戶組(group)添加權(quán)限,一般建議直接通過(guò)django admin進(jìn)行。如果你希望手動(dòng)給group添加或刪除權(quán)限,你可以使用如下方法。

mygroup.permissions = [permission_list]
mygroup.permissions.add(permission, permission, ...)
mygroup.permissions.remove(permission, permission, ...)
mygroup.permissions.clear()

如果你要將某個(gè)用戶移除某個(gè)用戶組,可以使用如下方法。

myuser.groups.remove(group, group, ...) #
myuser.groups.clear()

Django自帶權(quán)限機(jī)制的不足

Django自帶的權(quán)限機(jī)制是針對(duì)模型的,這就意味著一個(gè)用戶如果對(duì)Article模型有change的權(quán)限,那么該用戶獲得對(duì)所有文章對(duì)象進(jìn)行修改的權(quán)限。如果我們希望實(shí)現(xiàn)對(duì)單個(gè)文章對(duì)象的權(quán)限管理,我們需要借助于第三方庫(kù)比如django guardian。至于該庫(kù)的使用,我們以后再詳細(xì)介紹。

到此這篇關(guān)于Django 權(quán)限管理(permissions)與用戶組(group)詳解的文章就介紹到這了,更多相關(guān)Django 權(quán)限管理與用戶組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論