django開發之許可權管理(一)——許可權管理詳解(許可權管理原理以及方案)、不使用許可權框架的原始授權方式詳解

BigC哥發表於2018-12-31

歡迎關注,回覆關鍵詞:面試題
在這裡插入圖片描述

知識清單
1.瞭解基於資源的許可權管理方式
2. 掌握許可權資料模型
3. 掌握基於url的許可權管理(不使用許可權框架的情況下實現許可權管理)
許可權管理原理知識
什麼是許可權管理
只要有使用者參與的系統一般都要有許可權管理,許可權管理實現對使用者訪問系統的控制。按照安全規則或安全策略控制使用者可以訪問而且只能訪問自己被授權的資源。
許可權管理包括使用者認證和使用者授權兩部分。
使用者認證
使用者認證概念
使用者認證—— 使用者去訪問系統,系統需要驗證使用者身份的合法性。最常用的使用者身份認證方法:1.使用者密碼方式、2.指紋打卡機、3.基於證照的驗證方法。系統驗證使用者身份合法,使用者方可訪問系統的資源。
使用者認證流程
在這裡插入圖片描述
關鍵物件
subject:主體,理解為使用者,可能是程式,都要去訪問系統的資源,系統需要對subject進行身份認證。
principal:身份資訊,通常是唯一的,一個主體可以有多個身份資訊,但是隻能有一個主身份資訊(primary principal)。
credential:憑證資訊,可以是密碼、證照、指紋等。
總結:主體在進行身份認證時需要提供身份資訊和憑證資訊。
使用者授權
使用者授權概念
使用者授權,簡單理解為訪問控制,在使用者認證通過後,系統對使用者訪問資源進行控制,當使用者具有資源的訪問許可權方可訪問。
授權流程
在這裡插入圖片描述
其中橙色為授權流程
關鍵物件
授權的過程可以理解為 who 對 what(which) 進行how操作
who:主體,即subject,subject在認證通過後,系統進行訪問控制。
what(which):資源(Resource) ,subject必須具備資源訪問許可權才可以訪問該資源。資源包括很多方面比如:使用者列表頁面、商品修改選單、商品id為001的商品資訊。
資源分為資源型別和資源例項:
例如系統的使用者資訊就是資源型別,相當於Java類。
系統中id為001的使用者就是資源例項,相當於new的Java物件。
how:許可權/許可(permission),針對資源的許可權或許可,subject必須具有permission方可訪問資源,如何訪問/操作需要定義permission,許可權比如:使用者新增、使用者新增、商品刪除。
許可權模型
主體(賬號、密碼)
資源(資源名稱,訪問地址)
許可權(許可權名稱、資源id)
角色(角色名稱)
角色和許可權關係(角色id、許可權id)
如下圖:
在這裡插入圖片描述

通常企業開發中將資源和許可權合併為一張許可權表,如下:
資源(資源名稱、訪問地址)
許可權(許可權名稱、資源id)
合併為:
許可權(許可權名稱、資源名稱、資源訪問地址)

在這裡插入圖片描述
上圖被稱為許可權管理的通用模型,不過在企業開發中根據系統自身特點還會對上圖進行修改,但是使用者、角色、許可權、使用者角色關係、角色許可權關係是必不可少的。
分配許可權
使用者需要分配相應的許可權才可以訪問相應的資源。許可權是對資源的操作許可。
通常給使用者分配資源許可權需要將許可權資訊持久化,比如儲存在關聯式資料庫中。
把使用者資訊、許可權管理、使用者分配的許可權資訊寫入到資料庫(許可權資料模型)。
許可權控制(授權核心)
基於角色的訪問控制
RBAC (Role based access control) 基於角色的訪問控制
比如:
系統角色包括:部門經理、總經理…(角色針對使用者進行劃分)
基本流程:
在這裡插入圖片描述
#注意下面這是版本一

1:建立一個app

1.1命令視窗:python manage.py startapp rbac 1.2在settings中註冊這個app
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'web.apps.WebConfig',
    'rbac.apps.RbacConfig',
]

2:開始model設計

2.1:使用者設計,角色設計,許可權設計(url即許可權)在rbac的models中寫入相應的設計
from django.db import models


class Menu(models.Model):
    """
    選單表  一級選單
    """
    title = models.CharField(max_length=32)
    icon = models.CharField(max_length=64, null=True, blank=True, verbose_name='圖示')
    # 預設值為1
    weight = models.IntegerField(default=1, verbose_name='顯示權重')

    def __str__(self):
        return self.title


class Permission(models.Model):
    """
    許可權表
    可以做二級選單的許可權   menu 關聯 選單表
    不可以做選單的許可權    menu=null
    """
    url = models.CharField(max_length=32, verbose_name='許可權')
    title = models.CharField(max_length=32, verbose_name='標題')
    menu = models.ForeignKey('Menu', null=True, blank=True)
    # 自己關聯自己
    parent = models.ForeignKey('self', null=True, blank=True)
    # 寫法二
    # parent = models.ForeignKey('Permission', null=True, blank=True)
    name = models.CharField(max_length=32, verbose_name='URL別名')

    class Meta:
        verbose_name_plural = '許可權'
        verbose_name = '許可權'

    def __str__(self):
        return self.title


class Role(models.Model):
    """
    角色表
    """
    name = models.CharField(max_length=32, verbose_name='名稱')
    permissions = models.ManyToManyField('Permission', verbose_name='角色擁有的許可權', blank=True)

    def __str__(self):
        return self.name


class User(models.Model):
    """
    使用者表
    """
    name = models.CharField(max_length=32, verbose_name='名稱')
    password = models.CharField(max_length=32, verbose_name='密碼')
    roles = models.ManyToManyField('Role', verbose_name='使用者擁有的角色', blank=True)

    def __str__(self):
        return self.name

執行資料庫的遷移

python manage.py makemigrations

python manage.py migrate

在這裡插入圖片描述
在這裡插入圖片描述

在admin中註冊後臺可顯示的 和可編輯的欄位(利用django強大的後臺)
在這裡插入圖片描述

from django.contrib import admin
from rbac import models


class PermissionModelAdmin(admin.ModelAdmin):
    list_display = ['title', 'url', 'menu', 'parent', 'name']  # 展示的欄位
    list_editable = ['url', 'menu', 'parent', 'name']  # 編輯的欄位


class MenuModelAdmin(admin.ModelAdmin):
    list_display = ['title', 'icon', 'weight']  # 展示的欄位
    list_editable = ['icon', 'weight']  # 編輯的欄位


admin.site.register(models.Permission, PermissionModelAdmin)
admin.site.register(models.Role)
admin.site.register(models.User)
admin.site.register(models.Menu, MenuModelAdmin)

建立超級管理員使用者

python manage.py createsuperuser

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述
當然 我們也可以配置顯示為中文的後臺
在settings檔案中

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'

這樣就可以顯示為中文的後臺的了

相關文章