排序和过滤类源码分析

# 继承了GenericAPIView+ListModelMixin,只要在视图类中配置filter_backends它就能实现过滤和排序
	-drf内置的过滤类(SearchFilter),排序类(OrderingFiler)
    -django-filter
    -自定义:写一个类,继承BaseFilterBackend,重写filter_queryset,返回的qs对象,就是过滤或排序后的
    
    
# 只有获取多有才涉及到排序
	-list方法
    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)
    
    
    -self.filter_queryset完成了过滤,当前在视图类中,self是视图类的对象,去视图类中找没找到,去父类---》GenericAPIView---》filter_queryset
    
        def filter_queryset(self, queryset):
            for backend in list(self.filter_backends):
                queryset = backend().filter_queryset(self.request, queryset, self)
            return queryset



  # 总结:
	-写的过滤类要重写filter_queryset,返回qs(过滤或排序后)对象
    -后期如果不写过滤类,只要在视图类中重写filter_queryset,在里面实现过滤也可以

RBAC的介绍和使用

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

    • 在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限,这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便
  • RBAC权限管理的模式,最适合公司内部的管理系统,不适合对外互联网用户的系统

-用户:用户表
    -角色(部门):角色表(部门表)
    -权限:权限表
    
    -所有权限都是存在权限表中一条条的记录(发工资,招聘员工,开员工,发布新版本,开董事会)
    -权限是授予角色的(部门的),一个个角色,就是一条条记录(开发角色,hr角色,股东角色)
    -用户:一个个用户是用户表中一条条记录,用户属于某个部门
    
    -三个表之间的关系
        -用户和角色关系:多对多,中间表
        -角色和权限关系:多对多,中间表
        -5张表了
            -用户表
            -角色表
            -权限表
            -用户和角色关联表
            -角色和权限关联表
            
            
    -举例子:
            用户表:
            id     姓名 
            1      张三
            2      里斯
            角色表
            id    角色名称
            1      hr角色
            2      股东角色
            3      开发角色
            权限表
            id   权限名词
            1     发工资
            2     招人
            3     提交代码
    
    # 张三要有提交代码的权限
            用户和角色中间表:
            id   角色id   用户id
            1     3       1
            权限和角色的中间表
            id    角色id   权限id
            1       3       3
  • django的后台管理admin就自带了rbac的权限,通过auth模块实现的,比普通rbac更高级一些
本来5张表
    -django是6张表,用户和权限的多对多关系表(一个用户可以分配多个权限,一个权限可以给多个用户)
    	-6张表了
            -用户表
            -角色表
            -权限表
            -用户和角色关联表
            -角色和权限关联表
            -用户和权限的多对多关系表
   -启用了admin和auth,这6张表就迁移进去了
        auth_user # 用户表
        auth_group # 角色,组,部门表
        auth_permission # 权限表
        auth_user_groups # 用户和角色中间表
        auth_group_permissions # 角色跟权限中间表
        auth_user_user_permissions#用户和权限的中间表
        
  -之前很多公司写后台管理使用dajngo,使用django的admin二次开发,不用写权限了,快速加功能即可

 -体验django admin的rbac的权限控制
ACL、RBAC、ABAC(PBAC,CBAC)权限控制的介绍
  • ACL(Access Control List访问控制列表)

    • 将用户或组等使用者直接与对象的权限对接
    • 用户表,权限表,中间 给用户授予某些权限即可
  • RBAC(Role-Based Access Control基于角色的访问控制)

    • 将用户与角色对接,然后角色与对象的权限对接
    • RBAC+ACL django,公司用的比较多啊
  • 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位置、天气等环境属性。

权限表

id	权限名  
1	开除员工

id	权限名     属性
1	开除员工   女
1	开除员工   男
方便我们快速做权限控制(acl,rbac,abac。。。)

安装pip3 install casbin

import casbin

e = casbin.Enforcer("./model.conf", "./policy.csv")

sub = "lqz"  # 想要访问资源的用户
obj = "book"  # 将要被访问的资源
act = "get"  # 用户对资源进行的操作


# 自己写acl的控制
# 当前用户id,去权限和用户表查询即可,有记录就是有权限

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


if e.enforce(sub, obj, act):
    # 允许alice读取data1
    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,bob,data2,write
p,lqz,book,get

后台管理simplui的介绍和使用

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

  • 对django admin后台管理进行美化

    • xadmin(不用了,过时了)
    • simpleui(正红)

安装

pip3 install django-simpleui

修改默认后台模板为simpleui(配置文件里注册)

INSTALLED_APPS = [
		'simpleui',  # 要放在首行
]

自定义菜单(左边侧边栏)

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

字段说明

字段	说明

name	菜单名
icon	图标,参考element-ui和fontawesome图标
url	链接地址,绝对或者相对,如果存在models字段,将忽略url
models	子菜单,自2021.02.01+版本 支持最多3级菜单,使用方法可以看下方例子
newTab	boolean,default:False,浏览器新标签中打开,自2022.6.13开始支持

一行数据,显示哪些字段+添加按钮(admin.py中配置)

@admin.register(models.Banner)
class EmployeAdmin(admin.ModelAdmin):
	# 一行数据显示哪些字段(表里有的)
	list_display = ('id', 'title', 'link', 'is_show')

	# 增加自定义按钮
	actions = ['make_copy']
	def make_copy(self, request, queryset):
		# 点击触发它
		# queryset:选中的数据
		# request 请求对象
		print(queryset)

		make_copy.short_description = '我叫按钮'
		make_copy.confirm = '你是否执意要点击这个按钮?

关闭登录页面的粒子动画(在项目的settings.py中配置)

# SIMPLEUI_LOGIN_PARTICLES = True
SIMPLEUI_HOME_INFO = False
 posted on 2022-10-13 15:40  Joker_Ly  阅读(244)  评论(0)    收藏  举报