1. 程式人生 > 實用技巧 >RBAC基於角色訪問控制

RBAC基於角色訪問控制

一. 什麼是RBAC#

1. 概念#

Copy
RBAC(Role-Based Access Control)許可權模型的概念,即:基於角色的許可權控制。通過角色關聯使用者,角色關聯許可權的方式間接賦予使用者許可權。

2. 應用#

Copy
RBAC - Role-Based Access Control
Django的 Auth元件 採用的認證規則就是RBAC

1)像專門做人員許可權管理的系統(CRM系統)都是公司內部使用,所以資料量都在10w一下,一般效率要求也不是很高
2)使用者量極大的常規專案,會分兩種使用者:前臺使用者(三大認證) 和 後臺使用者(BRAC來管理)
結論:沒有特殊要求的Django專案可以直接採用Auth元件的許可權六表,不需要自定義六個表,也不需要斷開表關係,單可能需要自定義User表

3. 前後臺許可權控制#

Copy
1)後臺: 使用者對各表操作,是後臺專案完成的,我們可以直接藉助admin後臺專案(Django自帶的)
    後期也可以用xadmin框架來做後臺使用者許可權管理. 如django的後臺管理許可權
    auth_user        使用者
    auth_group       使用者組
    auth_permission  使用者許可權
    auth_user_groups           使用者屬於的使用者組, 使用者組包含的使用者
    auth_group_permissions     使用者組賦予的許可權
    auth_user_user_permissions 使用者屬於使用者組, 因此使用者也含有該組的許可權

2
)前臺: 使用者的許可權管理如何處理 定義了一堆資料介面的檢視類,不同的登入使用者是否能訪問這些檢視類,能就代表有許可權,不能就代表無許可權 前臺使用者許可權用drf框架的 三大認證: 認證, 許可權, 頻率

二. Django的內建RBAC(六表)

1. 許可權三表

2. 許可權六表

三. 實操

1. models.py

Copy
from django.db import models

from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
    mobile = models.CharField(max_length=11
, unique=True) def __str__(self): return self.username class Book(models.Model): name = models.CharField(max_length=64) def __str__(self): return self.name class Car(models.Model): name = models.CharField(max_length=64) def __str__(self): return self.name

2. admin.py

Copy
from . import models

from django.contrib.auth.admin import UserAdmin as DjangoUserAdmin

# 自定義User表後,admin介面管理User類
class UserAdmin(DjangoUserAdmin):
    # 新增使用者課操作欄位
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'password1', 'password2', 'is_staff', 'mobile', 'groups', 'user_permissions'),
        }),
    )
    # 展示使用者呈現的欄位
    list_display = ('username', 'mobile', 'is_staff', 'is_active', 'is_superuser')


admin.site.register(models.User, UserAdmin)
admin.site.register(models.Book)
admin.site.register(models.Car)

3. 流程分析

Copy
先建立超級使用者, 再通過超級使用者建立普通使用者, 為普通使用者新增使用者組,
為使用者組設定A許可權. 在為使用者設定B許可權. 最後將使用者加入該使用者組中,
於是使用者在有B許可權的基礎之上, 又有了A許可權.