🍖RBAC 基于角色访问控制

一.RBAC介绍

1.什么是RBAC

  • RBAC 是基于角色的访问控制 (Role-Based Access Control )
  • 在 RBAC 中, 权限与角色相关联, 用户通过成为适当角色的成员而得到这些角色的权限
  • 这就极大地简化了权限的管理, 这样管理都是层级相互依赖的, 权限赋予给角色, 而把角色又赋予用户, 这样的权限设计很清楚, 管理起来很方便

2.RBAC的应用

  • Django的 Auth组件 采用的认证规则就是RBAC
  • 专门做人员权限管理的系统(CRM系统), 公司内部使用, 数据量都在10w以下, 一般效率要求也不是很高
  • 用户量极大的常规项目, 会分两种用户:前台用户(三大认证) 和 后台用户(使用RBAC来管理)

没有特殊要求的Django项目可以直接采用Auth组件的权限六表, 不需要自定义六个表, 也不需要断开表关系,单可能需要自定义User表

3.前台用户(三大认证)

  • 前台指的不是前端, 而是普通用户所看到的界面, 使用认证、权限、频率来管理控制访问
  • 简单来说 : 认证确定了你是谁
  • 权限确定你能不能访问某个接口
  • 限制确定你访问的某个接口的频率

4.后台用户(使用BRAC来管理)

  • 后台指的是后台管理界面, 使用 RBAC 基于角色的访问控制

例如 :

  • 普通员工只能访问某张表的某条记录
  • 管理员或组长能对表和数据进行修改和新增等操作
  • 老板能对所有数据拥有所有权限

二.RBAC的演变过程

1.用户与权限直接关联

image-20210421232616387

  • 也就是某个用户拥有某个权限, 这种结构能够很清晰的表现出用户和权限之间的关系
  • 问题 : 以后随着人员增加, 每一个用户都需要重新授权或者朱七、王八离职之后, 需要针对每一个用户进行多种权限的回收, 繁琐

2.用户与权限之间添加角色

image-20210421233815220

  • 将用户进行分类, 加进不同的角色里边(相当于组的概念), 一个角色拥有某些权限, 具有统一角色的用户拥有相同的权限
  • 一个用户也可以对应多个角色

三.RBAC表设计

image-20210421234803964

1.三张表

  • 用户表 : auth_user
  • 角色表 : auth_group
  • 权限表 : auth_permission

用户表与角色表通过外键与权限表关联

image-20210421235028926

2.六张表

  • 用户表 : auth_user
  • 角色表 : auth_group
  • 权限表 : auth_permission
  • 角色和权限是多对多 : auth_group_permissions
  • 用户和角色是多对多 : auth_user_groups
  • 用户和权限的多对多表 : auth_user_user_permissions

image-20210421235423297

四.实操

1.models.py 中写模型类, 扩写一下 auth_user 表

from django.contrib.auth.models import AbstractUser

# 为auth_user表增加phone字段
class UserInfo(AbstractUser):
    phone = models.CharField(max_length=11, unique=True)

    class Meta:
        verbose_name_plural = '用户信息表'

    def __str__(self):
        return self.username

2.admin.py

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

# 自定义User表后,admin界面管理User类
class UserAdmin(DjangoUserAdmin):
    # 添加用户可操作字段
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'password', 'is_staff', 'phone', 'groups', 'user_permissions'),
        }),
    )
    # 展示用户呈现的字段
    list_display = ('username', 'phone', 'is_staff', 'is_active', 'is_superuser')


admin.site.register(models.UserInfo, UserAdmin)

3.访问后台管理

aaazzzxxx

posted @ 2021-04-22 16:43  给你骨质唱疏松  阅读(281)  评论(1编辑  收藏  举报