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

排序和过滤源码分析

1.继承GenericAPIView+ListModelMixin,在视图类中配置filter_backends,它就可以实现过滤和排序
-drf内置的过滤类(SearchFilter)、排斥类(OrderingFiler)
-django-filter
-自定义过滤、排序,写一个继承BaseFilterBackend的类,重写filter_queryset,返回qs对象,角色过滤后的或排序后的

2.ListModelMixin
-z只有获取多条才涉及排序
def list(self, request, *args, **kwargs):
    # self.get_queryset()所有数据,通过self.filter_queryset返回qs
    # self.filter_queryset完成过滤
    queryset = self.filter_queryset(self.get_queryset())
    page = self.paginate_queryset(queryset)
    # 视图类中配置了分页类,代表有分页
    if page is not None:
        serializer = self.get_serializer(page, many=True)
        return self.get_paginated_response(serializer.data)
	# 如果没有分页,走正常序列化返回
    serializer = self.get_serializer(queryset, many=True)
    return Response(serializer.data)

3.self.get_serializer完成了过滤,在视图类中,self是视图类的对象,视图类中没有,去父类GenericAPIView中找到filter_queryset(140行)
def filter_queryset(self, queryset):
    # 循环取出自己配置的过滤类
    for backend in list(self.filter_backends):
        # 实例化过滤类对象调用filter_queryset方法,返回过滤后的数据
        queryset = backend().filter_queryset(self.request, queryset, self)
    return queryset
'所以写过滤类要重写filter_queryset方法,返回qs(过滤或排序后)对象,如果不写过滤类,只在视图类中重写filter_queryset方法,也可以实现过滤'

ACL、RBAC、ABAC(PBAC,CBAC)

RBAC的介绍和使用

1.RBAC
-基于角色的访问控制(Role-Based Access Control)
-权限捕鱼用户直接关联,而是建立一个角色表,权限与角色相关,用户通过成为适当的角色成员而得到角色的权限。限赋予给角色,角色又赋予用户,这样权限设计清楚,权限管理起来很方便

2.RBAC权限管理的模式,最适合公司内部的管理系统,不适合对外互联网用户的系统
-所有权限都是存在权限表中一条条的记录(发工资、招聘员工、开除员工、发布新版本)
-权限是授予角色(部门)的,一个个角色,就是一条记录(开发、hr、股东)
-一个个用户是用户表中一条条记录,用户属于某个部门
2.1三个表的关系
-用户与角色是多对多,产生一张中间表
-角色与用户是多对多,产生一张中间表
-一共5张表(用户表、角色表、权限表、用户角色关联表、角色与权限关联表)

3.django的后台管理admin就自带了rbac的权限,通过auth模块实现,比普通rbac更高级
-django是6张表,多了用户和权限的多对多关系表
-迁移后会自动创建这6张表
auth_user  # 用户表
auth_group  # 角色,组,部门表
auth_permission  # 权限表
auth_user_groups  # 用户和角色中间表
auth_group_permissions  # 角色跟权限中间表
auth_user_user_permissions  # 用户和权限的中间表
'很多公司写后台管理使用dango,使用django的admin二次开发,不用写权限了,快速加功能即可'

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

1.ACL(Access Control List,访问控制列表)
-将用户或组等使用者直接与对象的权限对接
-用户表、权限表、中间表,给用户授予某些权限即可

2.RBAC(Role-Based Access Control,基于角色的访问控制)
-将用户与角色对接,然后角色与对象的权限对接
-RBAC+ACL(django),公司用的比较多

3.ABAC(Attribute-Based Access Control,基于属性的访问控制)
ABAC(Attribute-Based Access Control,基于属性的访问控制)
又称为PBAC(Policy-Based Access Control,基于策略的访问控制)
CBAC(Claims-Based Access Control,基于声明的访问控制)
-ABAC是一种灵活的授权模型,是通过实体的属性、行为属性、相关的环境来控制是否有对操作对象的权限
-

3.1传统的ACL、RBAC的架构是
{subject,action,object},
-而ABAC的架构是
{subject,action,object,contextual}且为他们添加了parameter(参数)
'''
subject属性:如用户的年龄、部门、角色等主题属性
action属性:如查看、读取、编辑、删除等行为属性
object属性:如银行账户、文章、评论等对象或资源属性
ontextual属性:如时段、IP地址、天气等环境属性
'''

casbin的使用

import casbin

e = casbin.Enforcer("./model.conf", "./policy.csv")
sub = "barry"  # 想要访问资源的用户
obj = "book"  # 将要被访问的资源
act = "get"  # 用户对资源进行的操作
if e.enforce(sub, obj, act):
    print('有权限')  # 如果允许这种操作访问资源则执行
else:
    print('没有权限')  # 如果不允许这种操作访问资源则抛异常

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,tom,data2,write
p,barry,book,get

后台管理simplui的使用

1.django admin自带权限控制,但是时前后端混合的,我们可以二次开发出公司内部的自动化运行、自动化测试、人事管理系统、订单系统,但是样子不好看,所以对django admin进行美化或基于drf+vue 自己写前后端分离的权限管理
1.1对django admin进行美化
xadmin(不用了,过时了)
simpleui(正红)
1.2下载simpleui模块
pip3 install django-simpleui
-在配置文件配置即可
INSTALLED_APPS = [
    'simpleui',
]

1.2

自定义菜单(settings.py)

import time

SIMPLEUI_CONFIG = {
    'system_keep': False,
    'menu_display': ['我的首页', '图书管理', '权限认证', '多级菜单测试', '动态菜单测试'],  # 开启排序和过滤功能, 不填此字段为默认排序和全部显示, 空列表[] 为全部不显示.
    'dynamic': True,  # 设置是否开启动态菜单, 默认为False. 如果开启, 则会在每次用户登陆时动态展示菜单内容
    'menus': [{
        'name': '我的首页',
        'icon': 'fas fa-code',
        'url': 'https://gitee.com/tompeppa/simpleui',
        # 浏览器新标签中打开
        'newTab': True,
    }, {
        'app': 'app01',
        'name': '图书管理',
        'icon': 'fas fa-code',
        'models': [{
            'name': '用户',
            'icon': 'fa fa-user',
            'url': 'app01/userinfo'
        }, {
            'name': '用户',
            'icon': 'fa fa-user',
            'url': 'app01/book'
        }]
    }, {
        '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': '内网穿透',
            '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'
        }]
    }]
}

(admin.py)

@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 = '你是否执意要点击这个按钮?'
posted @   无言以对啊  阅读(2851)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示

目录导航