IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> dir_day11 -> 正文阅读

[Python知识库]dir_day11

1 排序和过滤源码分析

继承了GenericAPIView+ListModelMixin,只要在视图类中配置filter_backends它就能实现过滤和排序

  • drf内置的过滤类(SearchFilter),排序类(OrderingFiler)
  • django-filter

过滤

内置过滤:特点模糊查找

from rest_framework.filters import SearchFilter


class BookViewSet(ViewSetMixin, ListAPIView):
    queryset = models.Book.objects
    serializer_class = BookModelSerializer
    authentication_classes = [LoginAuth, ]
    # throttle_classes = [IPThrottling, ]
    filter_backends = [SearchFilter]
    search_fields = ['name', 'price', ]
  • 第三方过滤:不支持模糊查询,是精准匹配
  • 1.安装三方插件
  • 2 使用模块 from django_filters.rest_framework import DjangoFilterBackend
    -3 在配置文件中配置(settings.py)
INSTALLED_APPS = [
    ...
    'django_filters',  # 需要注册应用,
]
  • 4 在视图中使用
class BookViewSet(ViewSetMixin, ListAPIView):
    queryset = models.Book.objects
    serializer_class = BookModelSerializer
    authentication_classes = [LoginAuth, ]
    filter_backends = [DjangoFilterBackend, ]
    filter_fields = ['name', 'price']

自定义:写一个类,继承BaseFilterBackend,重写filter_queryset,返回的qs对象,就是过滤或排序后的

from rest_framework.filters import BaseFilterBackend
from django.db.models import Q


class Myfilter(BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        # 获取过滤参数
        qs_name = request.query_params.get('name')
        qs_price = request.query_params.get('price')
        # title__contains:精确大小写查询,SQL中-->like BINARY
        # 利用Q查询构造或关系
        if qs_name:
            queryset = queryset.filter(name__contains=qs_name)
        elif qs_price:
            queryset = queryset.filter(price__contains=qs_price)
        elif qs_name or qs_price:
            queryset = queryset.filter(Q(name__contains=qs_name) | Q(price__contains=qs_price))
        return queryset

排序

只有获取多有才涉及到排序

  • 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,在里面实现过滤也可以

2 基于jwt的认证类

class JWTAuthentication(BaseAuthentication):
    def authenticate(self, request):
        # 放到头中:token-->HTTP_TOKEN   Authorization--->HTTP_AUTHORIZATION
        print(request.META)
        jwt_value = request.META.get('HTTP_TOKEN')
        # 验证token是否合法,jwt模块下一定有个验证token的函数
        try:
            payload = jwt_decode_handler(jwt_value)
        except jwt.ExpiredSignature:
            raise AuthenticationFailed('token过期了')
        except jwt.DecodeError:
            raise AuthenticationFailed('token解码失败')
        except jwt.InvalidTokenError:
            raise AuthenticationFailed('认证失败')
        # 执行到这,说明token合法,payload可以使用
        user_id = payload.get('user_id')
        user = UserInfo.objects.filter(pk=user_id).first()  # 每次都要查数据库,效率不太好
        return (user, jwt_value)
        # return (payload,jwt_value)

3 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的权限控制

4 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位置、天气等环境属性。
    自行创建
    py

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

5 后台管理simplui的介绍和使用

django admin自带了权限控制,但是是前后端混合的,我们可以二次开发,开发出公司内部的自动化运行,自动化测试,人事管理系统,订单系统。。。。样子不好看
对django admin进行美化
-xadmin(不用了,过时了)
-simpleui(正红)

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

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 21:11:19  更:2022-10-22 21:14:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 3:35:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计