drf10
内容概要
- drf-jwt源码执行流程
- 自定义用户表签发和认证
- simpleui使用
- 权限控制(acl,rbac)
- 补充
drf-jwt源码执行流程
签发
入口,就是我们配的路由



我们得找post方法,因为登录是post请求。
它没有就去它的父类找


然后去看它找的序列化类



然后我们去看,到底是怎样,它返回的东西就有这个token
这user到底是啥



我们去jwt的stting文件里面去找这个函数

我们根据这个路径去找到这个函数


现在这个荷载最少有 用户id,用户名,和过期时间
然后回来继续看这个全局钩子



这个就是去拿密钥的








总结
就知道了,token就是 先把头和荷载编码然后加密,然后再把密文贴到编码后的头和荷载后面
到时候认证的时候直接拿来加密比对签名就行了。
user就是用户
然后post方法把它搞一下格式返回给前端就可以了
认证
入口就是 我们导入的认证类


当对象再调用一个方法的时候先找自己,如果自己有则用自己的我们自己有。

然后回来继续走












认证类配置了,如果不传token,则不会校验,一定要配合权限使用
自定义用户表签发和认证
model层
class User(models.Model):
    username = models.CharField(max_length=32, verbose_name="用户名")
    password = models.CharField(max_length=32, verbose_name="密码")
    def __str__(self):
        return "用户对象%s" % self.username
    class Meta:
        verbose_name_plural = "用户表"
serlizer层
class UserSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField()
    def validate(self, attrs):
        username = attrs.get("username")
        password = attrs.get("password")
        user = User.objects.filter(username=username, password=password).first()
        if user:
            #  获取荷载
            payload = jwt_payload_handler(user)
            return {
                'token':
                # 获取token
                jwt_encode_handler(payload),
                'user': user
            }
        raise ValidationError("用户名或密码错误")
view层
# Create your views here.
from rest_framework.viewsets import ViewSet
from rest_framework.response import Response
from rest_framework_jwt.views import obtain_jwt_token
from .serializer import UserSerializer, CarSerializer
from rest_framework.decorators import action
from .models import Car
from .retuenresponse import return_response_func
class UserView(ViewSet):
    @action(methods=["post", ], detail=False)
    def login(self, request):
        res = UserSerializer(data=request.data)
        if res.is_valid():
            token = res.validated_data.get("token")
            user = res.validated_data.get("user")
            res1 = return_response_func(token, user, request)
            return res1
        return Response({"code": 101, "msg": res.errors})
url层
from django.urls import path, include
from app01 import views
from rest_framework.routers import SimpleRouter
route = SimpleRouter()
route.register("users", views.UserView, "users")
route.register("cars", views.CarView, "cars")
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/', include(route.urls))
]
simpleui的使用
之前在公司里,做项目,要使用权限,要快速搭建后台管理,使用django的admin直接搭建,django的admin界面不好看,
第三方的美化
-xadmin:作者弃坑了,bootstrap + jq
-simpleui: vue, 界面更好看
现阶段,一般前后端分离的比较多:django+vue
带权限的前端分离的快速开发框架
django-vue-admin
自己写
使用步骤
- 
安装 pip install django-simpleui 
- 
在app注册 我们需要在项目的中的settings.py文件中家兔一行simpleui即可  
- 
调整左侧导航栏(在django的settings文件中) SIMPLEUI_CONFIG = { 'system_keep': False, 'menu_display': ['汽车管理', '授权认证', '大屏展示'], # 开启排顺序和过滤功能,不填写此字段为默认排序和全部显示, # 空列表[],为全部不显示 'dynamic': True, # 设置是否开启动态菜单,默认为False # 如果开启, 则会在每次用户登录时动态显示菜单内容 'menus': [ { # 名称要与列表的对应 'name': "汽车管理", # 有app 一定要写app的名称 'app': 'app01', # 图片, 可以自己去官网选 'icon': 'fas fa-code', # 二级菜单 'models': [ { 'name': '汽车', 'icon': 'fa fa-user', # app01 下的 car表 'url': 'app01/car/' }, { 'name': '经销商', 'icon': 'fa fa-user', 'url': 'app01/distributor' }, { 'name': '厂家', 'icon': 'fa fa-user', 'url': 'app01/factory' } ] }, { 'name': '授权认证', 'icon': 'fas fa-user-shield', 'models': [ { 'name': '用户', 'icon': 'fa fa-user', 'app': 'app01', 'url': 'app01/user/' }, { 'name': '组', 'icon': 'fa fa-user', 'app': 'auth', 'url': 'auth/group/' }, ] }, { 'name': '大屏展示', 'icon': 'fa fa-file', 'models': [{ 'name': 'Baidu', 'icon': 'far fa-surprise', # 第三级菜单, 'models': [{ 'name': '爱奇艺', 'url': 'https://www.iqiyi.com/dianshiju/' }] }] } ] }一定要对应,不对应显示都显示不出来 - 
内部app,图书管理系统某个链要展示字段---》在 admin.py中 ---》自定义按钮 @admin.register(Car) class CarAdmin(admin.ModelAdmin): list_display = ('id', 'name', 'price', 'distributor') # 增加自定义按钮 actions = ['custom_button'] def custom_button(self, reqeust, queryset): print(queryset) custom_button.cofirm = "你是否之一要点这个按钮" # 显示的文本, 与django admin 一致 custom_button.short_description = "测试按钮" # icon, 参考element-ui icon与https://fontawesome.com # custom_button.ioc = 'fas fa-audio-description' # 指定element-ui 的按钮类型, 参考 # 按钮的颜色 # custom_button.type = 'danger' custom_button.style = 'color:black'
- 
其他配置项 SIMPLEUI_LOGIN_PARTICLES = False #登录页面动态效果 SIMPLEUI_LOGO = 'https://avatars2.githubusercontent.com/u/13655483?s=60&v=4'#图标替换 SIMPLEUI_HOME_INFO = False #首页右侧github提示 SIMPLEUI_HOME_QUICK = False #快捷操作 SIMPLEUI_HOME_ACTION = False # 动作
 
- 
大屏展示
监控大屏展示
{
    'name': '测试',
    'icon': 'fa fa-file',
    'models': [{
        'name': 'Baidu',
        'icon': 'far fa-surprise',
        # 第三级菜单,
        'models': [{
            'name': '爱奇艺',
            'url': 'https://www.iqiyi.com/dianshiju/'
        },
            {
                'name': '大屏展示',
                'url': '/show/'
            }
        ]
    }]
}

权限控制(acl,rbac)
rbac:基于角色的访问控制(Role-Based Access Control)在RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限,这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便
-用户表:用户与角色多对多关系
-角色表
- 一个角色可能有多个权限
- 开发角色,拉去代码,上传代码
- 财务角色:开工资,招人,开除人
-权限表:角色和权限是多对多
- 拉去代码
- 上传代码
- 部署项目
- 开工资
- 招人
- 开除人
通过5张表完成rbac控制:用户表,角色表,权限表,用户角色中间表,角色权限中间表
如果某个人,属于财务角色,但只想要拉去代码权限,不要上传代码权限
通过第六张表:dango的admin----》后台管理就是使用这套权限认证
用户表,角色表,权限表,角色权限中间表,用户和权限中间表
互联网项目
acl:Access Control List 访问控制列表,权限放在列表中
权限:权限表-----》发视频,评论,开直播
用户表:用户和权限是一对多
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号