drf10

内容概要

  • drf-jwt源码执行流程
  • 自定义用户表签发和认证
  • simpleui使用
  • 权限控制(acl,rbac)
  • 补充

drf-jwt源码执行流程

签发

入口,就是我们配的路由

image-20230210165203242

image-20230210165254225

image-20230210165331970

我们得找post方法,因为登录是post请求。

它没有就去它的父类找

image-20230210165729336

image-20230210170024882

然后去看它找的序列化类

image-20230210170207355

image-20230210170233790

image-20230210171431550

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

这user到底是啥

image-20230210172428615

image-20230210172754029

image-20230210172811241

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

image-20230210172933661

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

image-20230210182226399

image-20230210182404829

现在这个荷载最少有 用户id,用户名,和过期时间

然后回来继续看这个全局钩子

image-20230210182810178

image-20230210183307568

image-20230210183128692

这个就是去拿密钥的

image-20230210183327052

image-20230210183637971

image-20230210184015003

image-20230210190116194

image-20230210190158290

image-20230210190210652

image-20230210190236661

image-20230210190321766

总结

就知道了,token就是 先把头和荷载编码然后加密,然后再把密文贴到编码后的头和荷载后面

到时候认证的时候直接拿来加密比对签名就行了。

user就是用户

然后post方法把它搞一下格式返回给前端就可以了

认证

入口就是 我们导入的认证类

image-20230210213605125

image-20230210202843065

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

image-20230210213857440

然后回来继续走

image-20230210214029369

image-20230210214314575

image-20230210214343608

image-20230210215630189

image-20230210214705251

image-20230210214723024

image-20230210214740519

image-20230210215851753

image-20230210215133269

image-20230210220053990

image-20230210220309517

image-20230210220405090

认证类配置了,如果不传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

自己写

使用步骤

  1. 安装

    pip install django-simpleui

  2. 在app注册

    我们需要在项目的中的settings.py文件中家兔一行simpleui即可

    image-20230211160557388

  3. 调整左侧导航栏(在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/'
                    }]
                }]
            }
    
        ]
    
    }
    

    一定要对应,不对应显示都显示不出来

    1. 内部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'
      
    2. 其他配置项

      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/'

            }
        ]
    }]
}

image-20230211190017728

权限控制(acl,rbac)

rbac:基于角色的访问控制(Role-Based Access Control)在RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限,这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便

-用户表:用户与角色多对多关系

-角色表

- 一个角色可能有多个权限
- 开发角色,拉去代码,上传代码
- 财务角色:开工资,招人,开除人

-权限表:角色和权限是多对多

  • 拉去代码
  • 上传代码
  • 部署项目
  • 开工资
  • 招人
  • 开除人

通过5张表完成rbac控制:用户表,角色表,权限表,用户角色中间表,角色权限中间表

如果某个人,属于财务角色,但只想要拉去代码权限,不要上传代码权限

通过第六张表:dango的admin----》后台管理就是使用这套权限认证

用户表,角色表,权限表,角色权限中间表,用户和权限中间表

互联网项目

acl:Access Control List 访问控制列表,权限放在列表中

权限:权限表-----》发视频,评论,开直播

用户表:用户和权限是一对多

posted @ 2023-02-11 19:02  可否  阅读(34)  评论(0)    收藏  举报