RBAC--基於角色的權限管理系統
優勢:
1. 簡化了用戶和權限的關系
2. 易擴展,易於維護
3. RBAC不用給用戶單個分配權限,只用指向對應的角色就會有對應的權限,而且分配權限和收回權限都很方便
組成部分:用戶,角色,權限,用戶角色關系,角色權限關系
如下圖所示
功能需求列表:

權限控制流程

其實原理上是非常容易理解的,但是permission表的字段設計開始一直困擾着我,核心就兩個字段,operation,object,操作和對象,
django自帶的權限表就是將權限和具體操作的函數相關聯。
一個項目包含的表是成百上千張,而往往一些表的權限是相同的,在實際應用場景中,
我們並不需要將權限細分至每一張表,因此我們可以將權限抽象成幾個大類,例如,數據,用戶,消息,任務等等。
add data delete data edit data query data add user add info add task ......
django 權限設計實例
from datetime import datetime
from django.db import models
from django.contrib.auth.models import AbstractUser
class UserProfile(AbstractUser):
"""
用戶
"""
account = models.CharField(max_length=30, verbose_name="登錄名")
really_name = models.CharField(max_length=10, verbose_name="真實姓名", blank=True)
department = models.CharField(max_length=20, verbose_name="所屬部門", default="")
tel_phone = models.CharField(max_length=11, verbose_name="手機號")
create_time = models.DateTimeField(default=datetime.now, verbose_name="創建時間")
last_time = models.DateTimeField(default=datetime.now, verbose_name="最后登錄")
creator = models.CharField(default="Admin", verbose_name="創建者", max_length=20)
class Meta:
verbose_name = "用戶信息"
verbose_name_plural = verbose_name
class Role(models.Model):
name = models.CharField(max_length=20, verbose_name="角色名稱")
describe = models.CharField(max_length=200, null=True, blank=True, verbose_name="角色描述")
create_time = models.DateTimeField(default=datetime.now,verbose_name="創建時間")
class Meta:
verbose_name = "角色"
verbose_name_plural = verbose_name
class UserRole(models.Model):
user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, verbose_name="用戶")
role = models.ForeignKey(Role, on_delete=models.CASCADE, verbose_name="角色")
class Meta:
verbose_name = "用戶角色對應表"
verbose_name_plural = verbose_name
class Permission(models.Model):
cls_type = ((0, "拒絕"),
(1, "允許"))
name = models.CharField(max_length=30,null=True,verbose_name="權限名稱")
status = models.SmallIntegerField(choices=cls_type,default=0,verbose_name="狀態")
create_time = models.DateTimeField(default=datetime.now,verbose_name="創建時間")
class Meta:
verbose_name = "權限"
verbose_name_plural = verbose_name
