django開發之許可權管理(一)——許可權管理詳解(許可權管理原理以及方案)、不使用許可權框架的原始授權方式詳解
歡迎關注,回覆關鍵詞:面試題
知識清單
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中註冊這個appINSTALLED_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'
這樣就可以顯示為中文的後臺的了
相關文章
- Linux-許可權管理(ACL許可權)Linux
- Linux 許可權管理之目錄許可權限制Linux
- Android許可權管理之Permission許可權機制及使用Android
- PostgreSQL:許可權管理SQL
- Mysql——許可權管理MySql
- Mysql 許可權管理MySql
- oracle 許可權管理Oracle
- 4、許可權管理
- sql許可權管理SQL
- 許可權管理策略
- MySQL許可權管理MySql
- 許可權之選單許可權
- 【許可權管理】Oracle中檢視、回收使用者許可權Oracle
- MySQL 許可權詳解MySql
- Oracle的物件許可權、角色許可權、系統許可權Oracle物件
- DRF內建許可權元件之自定義許可權管理類元件
- 許可權框架之Shiro詳解框架
- Security 10:許可權管理
- SQL Server 許可權管理SQLServer
- 許可權管理[Linux]Linux
- MongoDB 3.0.8 許可權管理MongoDB
- 1.7.6. 授權和撤銷管理許可權
- 許可權管理之多租戶隔離授權
- linux許可權詳解Linux
- 許可權系統:一文搞懂功能許可權、資料許可權
- Android6.0------許可權申請管理(單個許可權和多個許可權申請)Android
- .NET 程式許可權控制、獲得管理員許可權程式碼
- 如何用 Vue 實現前端許可權控制(路由許可權 + 檢視許可權 + 請求許可權)Vue前端路由
- linux 檔案許可權 s 許可權和 t 許可權解析Linux
- Django(63)drf許可權原始碼分析與自定義許可權Django原始碼
- Oracle 使用者許可權管理與常用許可權資料字典列表Oracle
- ylbtech-許可權管理-資料庫設計-功能許可權管理技術資料庫
- ThinkPHP5+許可權管理PHP
- MySQL許可權管理實戰MySql
- ubuntu 許可權管理設定Ubuntu
- 【JavaWeb】許可權管理系統JavaWeb
- Linux基本許可權管理Linux
- Oracle ERP許可權管理Oracle