排序和过滤源码分析
使用过滤类和排序类需要继承GenericAPIView+ListModelMixin,再在视图类中配置filter_backends列表内写过滤类或排序类就能实现过滤和排序
SearchFilter:过滤类
OrderingFiler:排序类
filter_backends = [SearchFilter,OrderingFiler]
我们也可以自定义类继承BaseFilterBackend重写filter_queryset,返回后的qs对象就是过滤或排序后的数据,今天来看看源码了解执行流程:
-第一步:只有获取所有数据才设计到排序、过滤所以我们先看ListModelMixin中的list方法
第二步:知道了关键是filter_queryset方法完成的过滤,所以我们再看这个方法,视图类自己没有去父类GenericAPIView中找
总结:自定义过滤类要重写filter_queryset,返回过滤或排序后的qs对象。看了源码后知道以后也可以在视图类中直接重写filter_queryset在里面实现过滤
RBAC的介绍和使用
1.什么是RBAC
RBAC(Role-Based Access Control )基于角色的访问控制,在RBAC中-----权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这极大地简化了权限的管理,这样管理都是层级相互依赖的,权限赋予给角色而把角色又赋予用户,这样的设计管理起来很方便
例如:
RBAC权限管理的模式最适合公司内部的管理系统,不适合对外互联网用户的系统。
-公司内表与表关系
用户表:用户信息
角色表:部门
权限表:各种权限
其中用户表和角色表为多对多关系,角色表和权限表为多对多关系这样RBAC就会自动再生成两张中间表用来存放关系
2.django的admin自带的RBAC
在django的后台管理admin中就自带rbac的权限,通过auth模块实现比一般普通的rbac更高级,普通的rbac会创建5张表而django中的则会有6张比普通的多一张用户直接和权限的多对多关系表
- 启用admin和auth,6张表自动迁移进去
auth_user:用户表
auth_group:角色,部门表
auth_permission:权限表
auth_user_groups:用户和角色多对多中间表
auth_group_permissions:角色和权限多对多中间表
auth_user_user_permissions:用户和权限多对多中间表
-使用django的admin二次开发,不用写权限直接快速加功能即可
3.ACL、RBAC、ABAC权限控制的介绍
ACL(Access Control List)访问控制列表:
将用户或组等使用者直接与对象的权限对接
RBAC(Role-Based Access Control)基于角色的访问控制:
将用户与角色对接,角色再与对象的权限对接
ABAC(Attribute-Based Access Control)基于属性的访问控制:
ABAC又称之为PBAC(Policy-Based Access Control)基于策略的访问控制
还称之为CBAC(Claims-Based Access Control)基于声明的访问控制
后台管理simplui的介绍和使用
simplui用来对django admin进行美化,基于drf+vue开发自己写前后端分离的权限管理,还有一个xadmin也可以实现但是过时了而simplui正是当红
-在配置文件settings中配置
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': 'xx', '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