电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:4日期:2024-09-16 13:30:35

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

什么是權(quán)限?

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

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

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

我們在Django的admin中是可以很輕易地給用戶分配權(quán)限的。

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

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

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

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

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

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

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

user_A.has_perm(’blog.add_article’) user_A.has_perm(’blog.change_article’)

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

user_A.get_group_permissions() user_A.get_all_permissions()

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

有時django創(chuàng)建的4種可選權(quán)限滿足不了我們的要求,這時我們需要自定義權(quán)限。實現(xiàn)方法主要有兩種。下面我們將分別使用2種方法給Article模型新增了兩個權(quán)限,一個是publish_article, 一個是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 Articlefrom django.contrib.auth.models import Permissionfrom 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,)

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

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

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

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

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

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

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

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

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

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

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

from django.contrib.auth.models import Permission, Userfrom django.contrib.contenttypes.models import ContentTypefrom 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)限的驗證(Validation)

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

1. 視圖中驗證

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

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

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

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

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

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. 模板中驗證

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

{{ perms.blog }}

我們?nèi)绻袛喈斍坝脩羰欠駬碛衎log應(yīng)用下發(fā)表文章討論的權(quán)限,則使用:

{{ perms.blog.comment_article }}

這樣結(jié)合template的if標簽,我們可以通過判斷當前用戶所具有的權(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模型是多對多的關(guān)系。其作用在權(quán)限控制時可以批量對用戶的權(quán)限進行管理和分配,而不用一個一個用戶分配,節(jié)省工作量。將一個用戶加入到一個Group中后,該用戶就擁有了該Group所分配的所有權(quán)限。例如,如果一個用戶組editors有權(quán)限change_article, 那么所有屬于editors組的用戶都會有這個權(quán)限。

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

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

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

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

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

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

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

標簽: Django
相關(guān)文章:
主站蜘蛛池模板: hc22_hc22价格_hc22哈氏合金—东锜特殊钢| 河南档案架,档案密集架,手动密集架,河南密集架批发/报价 | 电竞学校_电子竞技培训学校学院-梦竞未来电竞学校官网 | 猎头招聘_深圳猎头公司_知名猎头公司 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-沼河浸过滤器 | 急救箱-应急箱-急救包厂家-北京红立方医疗设备有限公司 | 肉嫩度仪-凝胶测试仪-国产质构仪-气味分析仪-上海保圣实业发展有限公司|总部 | 成都思迪机电技术研究所-四川成都思迪编码器 | 冰晶石|碱性嫩黄闪蒸干燥机-有机垃圾烘干设备-草酸钙盘式干燥机-常州市宝康干燥 | 广州物流公司_广州货运公司_广州回程车运输 - 万信物流 | 杭州ROHS检测仪-XRF测试仪价格-百科 | 湖南自考_湖南自学考试 | 造价工程师网,考试时间查询,报名入口信息-网站首页 | 知网论文检测系统入口_论文查重免费查重_中国知网论文查询_学术不端检测系统 | 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 百度关键词优化_网站优化_SEO价格 - 云无限好排名 | ★济南领跃标识制作公司★济南标识制作,标牌制作,山东标识制作,济南标牌厂 | 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 | LED投光灯-工矿灯-led路灯头-工业灯具 - 山东普瑞斯照明科技有限公司 | 深圳APP开发_手机软件APP定制外包_小程序开发公司-来科信 | 螺钉式热电偶_便携式温度传感器_压簧式热电偶|无锡联泰仪表有限公司|首页 | 水平筛厂家-三轴椭圆水平振动筛-泥沙震动筛设备_山东奥凯诺矿机 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | FFU_空气初效|中效|高效过滤器_空调过滤网-广州梓净净化设备有限公司 | 巨野月嫂-家政公司-巨野县红墙安康母婴护理中心 | 电磁辐射仪-电磁辐射检测仪-pm2.5检测仪-多功能射线检测仪-上海何亦仪器仪表有限公司 | pbootcms网站模板|织梦模板|网站源码|jquery建站特效-html5模板网 | 大型工业风扇_工业大风扇_大吊扇_厂房车间降温-合昌大风扇 | 青州开防盗门锁-配汽车芯片钥匙-保险箱钥匙-吉祥修锁店 | 冷却塔风机厂家_静音冷却塔风机_冷却塔电机维修更换维修-广东特菱节能空调设备有限公司 | YT保温材料_YT无机保温砂浆_外墙保温材料_南阳银通节能建材高新技术开发有限公司 | EFM 022静电场测试仪-套帽式风量计-静电平板监测器-上海民仪电子有限公司 | 大鼠骨髓内皮祖细胞-小鼠神经元-无锡欣润生物科技有限公司 | 安徽免检低氮锅炉_合肥燃油锅炉_安徽蒸汽发生器_合肥燃气锅炉-合肥扬诺锅炉有限公司 | 横河变送器-横河压力变送器-EJA变送器-EJA压力变送器-「泉蕴仪表」 | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 蓝莓施肥机,智能施肥机,自动施肥机,水肥一体化项目,水肥一体机厂家,小型施肥机,圣大节水,滴灌施工方案,山东圣大节水科技有限公司官网17864474793 | 英超直播_英超免费在线高清直播_英超视频在线观看无插件-24直播网 | 水轮机密封网 | 水轮机密封产品研发生产厂家 | 金属雕花板_厂家直销_价格低-山东慧诚建筑材料有限公司 | 两头忙,井下装载机,伸缩臂装载机,30装载机/铲车,50装载机/铲车厂家_价格-莱州巨浪机械有限公司 |