RBAC-基于角色的访问控制

RBAC-基于角色的访问控制

什么是RBAC

RBAC 是基于角色的访问控制(Role-Based Access Control )

权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。
这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便

简而言之就是 划分权限的时候不用直接划分,授权 部门 的权限,然后由部门下发权限给员工

细谈RBAC

RBAC权限管理的模式,最适合公司内部的管理系统,不适合对外互联网用户的系统

  • RBAC三表

    • 用户:用户表

      一个个用户是用户表中一条条记录,用户属于某个部门

    • 角色(部门):角色表(部门表)

      ​ 权限是授予角色的(部门的),一个个角色,就是一条条记录(开发角色,hr角色,股东角色)

    • 权限:权限表

      ​ 所有权限都是存在权限表中一条条的记录(发工资,招聘员工,开员工,发布新版本,开董事会)

  • 三个表之间的关系

    用户和角色关系:多对多,中间表

    角色和权限关系:多对多,中间表

    角色和权限关联表:多对多,中间表

  • django自带的admin的表关系

    django的后台管理admin就自带了rbac的权限,通过auth模块实现的,比普通rbac更高级一些

    启用了admin和auth,这6张表就迁移进去了
    auth_user # 用户表
    auth_group # 角色,组,部门表
    auth_permission # 权限表
    auth_user_groups # 用户和角色中间表
    auth_group_permissions # 角色跟权限中间表
    auth_user_user_permissions#用户和权限的中间表

    img

    之前很多公司写后台管理使用dajngo,使用django的admin二次开发,不用写权限了,快速加功能即可

扩展

ACL、RBAC、ABAC(PBAC,CBAC)权限控制的介绍

  • ACL(Access Control List,访问控制列表)

    ​ 将用户或组等使用者直接与对象的权限对接。

    ​ 用户表,权限表,中间 给用户授予某些权限即可

  • RBAC(Role-Based Access Control,基于角色的访问控制)

    ​ 将用户与角色对接,然后角色与对象的权限对接

  • ABAC(Attribute-Based Access Control,基于属性的访问控制)

    ​ ABAC(Attribute-Based Access Control,基于属性的访问控制)
    又称为PBAC(Policy-Based Access Control,基于策略的访问控制)
    CBAC(Claims-Based Access Control,基于声明的访问控制)

传统的ACL、RBAC的架构是

{subject,action,object},
而ABAC的架构是
{subject,action,object,contextual}且为他们添加了parameter(参数)。

subject属性:比如用户的年龄、部门、角色、威望、积分等主题属性。

action属性:比如查看、读取、编辑、删除等行为属性。

object属性:比如银行账户、文章、评论等对象或资源属性。

contextual属性:比如时段、IP位置、天气等环境属性。

快速做权限控制(acl,rbac。。。。)

  • 权限控制

    import casbin
    
    e = casbin.Enforcer("./model.conf", "./policy.csv")
    
    sub = "lqz"  # 想要访问资源的用户
    obj = "book"  # 将要被访问的资源
    act = "get"  # 用户对资源进行的操作
    if e.enforce(sub, obj, act):
        # 允许alice读取data1
        print('有权限')
    else:
        # 拒绝请求,抛出异常
        print('没有权限')
    
    • 自己写acl的控制

      ​ 当前用户id,去权限和用户表查询即可,有记录就是有权限

    • 自己写rbac

      ​ 当前用户id,找到他的角色,根据角色拿出权限,判断当前访问有没有

  • model.conf

    [request_definition]
    r = sub, obj, act
    
    [policy_definition]
    p = sub, obj, act
    
    [policy_effect]
    e = some(where (p.eft == allow))
    
    [matchers]
    m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
    
  • policy.csv

    p,alice,data1,read
    p,bob,data2,write
    p,lqz,book,get
    

    控制权限所需要查询的数据

后台管理simplui的介绍和使用

simplui的介绍

django admin自带了权限控制,但是是前后端混合的,我们可以二次开发,开发出公司内部的自动化运行,自动化测试,人事管理系统,订单系统。。。。样子不好看

  • 对django admin进行美化

    1.xadmin(不用了,过时了)

    2.simpleui(正红)

  • 开源软件

    基于drf+vue 自己写前后端分离的权限管理

    go-vue-admin

simpleui使用

  • settings.py

    import time
    
    SIMPLEUI_CONFIG = {
        'system_keep': False,
        'menu_display': ['我的首页', '图书管理','权限认证', '多级菜单测试', '动态菜单测试'],  # 开启排序和过滤功能, 不填此字段为默认排序和全部显示, 空列表[] 为全部不显示.
        'dynamic': True,  # 设置是否开启动态菜单, 默认为False. 如果开启, 则会在每次用户登陆时动态展示菜单内容
        'menus': [
            {
                'name': '我的首页',
                'icon': 'fas fa-code',
                'url': '/index/',
    
            },
            {
                'app': 'app01',
                'name': '图书管理',
                'icon': 'fas fa-code',
                'models': [
                    {
                        'name': '用户',
                        'icon': 'fa fa-user',
                        'url': 'app01/userinfo/'
                    },
                    {
                        'name': '图书',
                        'icon': 'fa fa-user',
                        'url': 'app01/book/'
                    },
                    {
                        'name': '出版社',
                        'icon': 'fa fa-user',
                        'url': 'app01/publish/'
                    },
                ]
            },
            {
                'app': 'auth',
                'name': '权限认证',
                'icon': 'fas fa-user-shield',
                'models': [{
                    'name': '用户',
                    'icon': 'fa fa-user',
                    'url': 'auth/user/'
                }]
            },
            {
                # 自2021.02.01+ 支持多级菜单,models 为子菜单名
                'name': '多级菜单测试',
                'icon': 'fa fa-file',
                # 二级菜单
                'models': [
                    {
                        'name': '百度',
                        'icon': 'far fa-surprise',
                        # 第三级菜单 ,
                        'models': [
                            {
                                'name': '爱奇艺',
                                'url': 'https://www.iqiyi.com/dianshiju/'
                                # 第四级就不支持了,element只支持了3级
                            },
                            {
                                'name': '百度问答',
                                'icon': 'far fa-surprise',
                                'url': 'https://zhidao.baidu.com/'
                            }
                        ]
                    },
                    {
                        'name': 'lqz',
                        'url': 'https://www.wezoz.com',
                        'icon': 'fab fa-github'
                    }]
            },
            {
                'name': '动态菜单测试',
                'icon': 'fa fa-desktop',
                'models': [{
                    'name': time.time(),
                    'url': 'http://baidu.com',
                    'icon': 'far fa-surprise'
                }]
            }]
    }
    
    
    SIMPLEUI_LOGIN_PARTICLES = False
    SIMPLEUI_HOME_INFO = False
    
  • admin.py

    from django.contrib import admin
    
    # Register your models here.
    
    from .models import *
    
    
    @admin.register(Book)
    class BookAdmin(admin.ModelAdmin):
        list_display = ('id', 'title', 'price')
    
        # 增加自定义按钮
        actions = ['make_copy', ]
        def make_copy(self, request, queryset):
            print('adsfasdf')
        make_copy.short_description = '自定义按钮'
        # # icon,参考element-ui icon与https://fontawesome.com
        make_copy.icon = 'fas fa-audio-description'
        # # 指定element-ui的按钮类型,参考https://element.eleme.cn/#/zh-CN/component/button
        make_copy.type = 'danger'
        make_copy.confirm = '你是否执意要点击这个按钮?'
    
    
    
    admin.site.register(UserInfo)
    admin.site.register(Publish)
    

simpleui 集成监控大屏

从gitee上找到开源的前端页面---》集成到项目中即可

https://gitee.com/lvyeyou/DaShuJuZhiDaPingZhanShi?_from=gitee_search

  • 本质

    本质就是前后端混合的项目

posted @   Nirvana*  阅读(150)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示