RBAC权限管理系统

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

  

 

posted @ 2019-03-22 11:30  家迪的家  阅读(6506)  评论(0编辑  收藏  举报