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