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, ]
filter_backends = [SearchFilter]
search_fields = ['name', 'price', ]
- 第三方过滤:不支持模糊查询,是精准匹配
- 1.安装三方插件
- 2 使用模块 from django_filters.rest_framework import DjangoFilterBackend
-3 在配置文件中配置(settings.py)
INSTALLED_APPS = [
...
'django_filters',
]
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')
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
排序
只有获取多有才涉及到排序
def list(self, request, *args, **kwargs):
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):
print(request.META)
jwt_value = request.META.get('HTTP_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('认证失败')
user_id = payload.get('user_id')
user = UserInfo.objects.filter(pk=user_id).first()
return (user, 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):
>
> 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
|