34 RBAC 基于角色访问控制

344次阅读
没有评论

共计 1670 个字符,预计需要花费 5 分钟才能阅读完成。

一.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. 用户与权限直接关联

34 RBAC 基于角色访问控制

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

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

34 RBAC 基于角色访问控制

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

三.RBAC 表设计

34 RBAC 基于角色访问控制

1. 三张表

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

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

34 RBAC 基于角色访问控制

2. 六张表

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

34 RBAC 基于角色访问控制

四. 实操

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. 访问后台管理

34 RBAC 基于角色访问控制

正文完
 
shawn
版权声明:本站原创文章,由 shawn 2023-06-16发表,共计1670字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)