開發

Django默認權限機制介紹及實踐

廣告
廣告

所有演示代碼均基于Django 2.2版本

當Django配置文件中的INSTALL_APPS包含了django.contrib.auth時,就默認啟用了一個簡單的權限系統,提供了為用戶或組分配權限的方法

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

1.  默認的權限系統是基于表的控制,權限最小粒度是表

也就是說,假如有一個Blog表,我們可以賦予用戶或組對Blog表有delete的權限,那么用戶或組成員就可以刪除全部Blog,是不能控制用戶只能刪除自己創建的blog的

如果希望用戶只能刪除自己創建的Blog,不能刪除別人創建的Blog,這種需求Django默認的權限管理就無法實現了,需要用到object permission對象權限,有第三方模塊實現了對象權限,如django-guardian,你可以直接使用,或者也可以自己實現對象權限,具體思路可參考這篇文章:Django內置權限擴展案例

2.  每個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()

組權限修改方法:

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()

其中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()
{'blog.publish_blog', 'blog.delete_blog', 'auth.add_group', 'blog.change_blog'}

get_group_permissions()列出用戶所屬組的權限:

>>> User.objects.get(username='ops-coffee').get_group_permissions()
{'blog.publish_blog', 'blog.change_blog', 'blog.delete_blog'}

權限校驗

用戶對象可以通過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

has_perm 的參數由<app label>.<permission codename>兩部分組成,例如blog.delete_blog表示的就是名字為blog的APP下的delete_blog權限

后端View校驗權限

可以直接在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一樣

login_url: 非必須,登陸的url地址,當你沒有權限時自動跳轉到登陸頁,這里可以設置登陸地址的url

reise_exception: 非必須,當為True時,如果用戶沒有權限,則不會跳轉到登陸頁,而是引發PermissionDenied錯誤,返回403 Forbidden

如下例子,判斷用戶是否有blog的APP的change_blog權限,如果沒有則返回403錯誤

@permission_required('blog.change_blog', raise_exception=True)
def ops_coffee_view(request):
    ...

前端Template中校驗權限

當前登陸用戶的權限保存在模版變量{{ perms }}中,可以在模版中通過if判斷用戶是否擁有相應的權限而開放對應的內容,例如對于側邊欄菜單只顯示用戶有權限訪問的,就可以這么寫:

{% if perms.cmdb.view_project %}
    <li><a href="{% url 'project-list-url' %}"></i> 項目列表</a></li>
{% endif %}

{% if perms.cmdb.view_service %}
    <li><a href="{% url 'service-list-url' %}"></i> 服務列表</a></li>
{% endif %}

{% if perms.cmdb.view_environment %}
    <li><a href="{% url 'environment-list-url' %}"></i> 環境列表</a></li>
{% endif %}

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

本文轉載自運維咖啡吧 ,作者37丫37

我還沒有學會寫個人說明!

一網打盡:Java 程序員必須了解的計算機底層知識!

上一篇

云數據庫用戶滿意度第一,華為云如何成為企業級云數據庫首選?

下一篇

你也可能喜歡

Django默認權限機制介紹及實踐

長按儲存圖像,分享給朋友

ITPUB 每周精要將以郵件的形式發放至您的郵箱


微信掃一掃

微信掃一掃
重庆百变王牌开奖结果 南阳股票配资 模拟炒股是真钱吗 炒股暴富不外乎三种人 股票推荐群 融资融券 赢在投资 期货股票配资股票融资融资融券模拟炒股软件温州股票配资股票实盘模拟实盘智深金岸投资 理财规划 股票行情的战术 百晓配资 如何买股票指数 茅台股票行情今天 股票融资融券实盘操作 2000字万科股票分析 白银配资 st股票涨跌幅限制 股票配资平台哪个好