def 自定义表设置以及初步认识vue

发布时间 2024-01-04 15:15:51作者: 拆尼斯、帕丁顿

补:基于自定义表签发token

#   1 快速签发和认证
#   2 定制返回格式和认证
#   3 自定义登录和认证
------------------
#   4 自定义登录,自定义表

#   5 自定义认证类

路由:

from django.contrib import admin
from django.urls import path
from rest_framework.routers import SimpleRouter
from .views import UserView

router = SimpleRouter()
router.register('user', UserView, 'user')
urlpatterns = [

]
urlpatterns += router.urls

视图类:

from django.contrib import admin
from django.urls import path
from rest_framework.routers import SimpleRouter
from .views import UserView

router = SimpleRouter()
router.register('user', UserView, 'user')
urlpatterns = [

]
urlpatterns += router.urls

序列化类:

from rest_framework import serializers
from .models import UserInfo
from rest_framework.exceptions import APIException
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer, TokenObtainSerializer


# 只做校验
class LoginSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField()

    def validate(self, attrs):
        username = attrs.get('username')
        password = attrs.get('password')
        user = UserInfo.objects.filter(username=username, password=password).first()
        if user:
            # 签发token,使用RefreshToken直接签发
            refresh = RefreshToken.for_user(user)
            return {
                'code': 100,
                'msg': '登录成功',
                'username': username,
                # 'icon':user.icon,
                'access': str(refresh.access_token),
                'refresh': str(refresh)

            }
        else:
            raise APIException({'code': 999, 'msg': '用户名或密码错误11'})

表模型

class UserInfo(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    age = models.IntegerField()
    gender = models.IntegerField(choices=((1, ''), (2, ''), (0, '未知')))

基于自定义表编写认证类.

 

from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import APIException
from rest_framework_simplejwt.tokens import AccessToken

from rest_framework_simplejwt.authentication import JWTAuthentication

# JWTAuthentication 有authenticate 里面完成对token的认证

from .models import UserInfo


class LoginAuthentication(BaseAuthentication):
    def authenticate(self, request):
        # 1 取出前端传入的token:它放哪了?后端定的:定死key值叫token:value值直接不带任何前缀
        token = request.META.get('HTTP_TOKEN')
        if token:
            # validated_token = self.get_validated_token(token)---》返回了AccessToken(token)传入的对象
            # 2 拿到token,验证token是否合法,是否过期,是否被篡改,伪造,如果都通过,根据payload中得userid取出当前用户
            try:
                validated_token = AccessToken(token)  # 源码中拿出来的
            except Exception as e:
                raise APIException({'code': 888, 'msg': str(e)})
            # 3 取出用户id,根据用户id,查出用户,返回
            # validated_token.payload['user_id']
            # validated_token['user_id']
            user = UserInfo.objects.filter(pk=validated_token['user_id']).first()
            return user, token

        else:
            raise APIException({'code': 101, 'msg': 'token必须携带'})

全局使用 - - -局部使用  :

****************************************

权限控制:

def中有权限控制

  真正的权限控制有:

acl权限控制:访问控制列表 Access Control List
        -互联网,对外项目
        -用户可以:
            user_id:1=[刷视频,评论,收藏,开直播]
            user_id:2=[刷视频]
        -表表示出权限
            用户表:
                id   name
                1    王叔
                2    李四
                3    张三
            权限表:
                id  user_id   permission_id
                1    1        1
                2    1        2
                3    1        3
                4    1        4
                5    2        1
                
            权限详情表:
                id  name        url      method
                1    刷视频      /video/     get
                2    评论        /commit/   post
                3    收藏        
                4    开直播
                
        -权限类:根据当前登录用户---》取出它所有权限,权限列表---》当前访问的比如是评论,如果有权限,返回True,没有权限,返回false
        
        
    2 rabc权限控制:基于角色的访问控制 Role-Based Access Control
        -公司内部项目
        -用户属于某个角色
        -角色跟权限有对应关系
        - 公司内有 财务   hr  开发 总裁
            -财务:张xx,李xx  :发工资权限,扣工资权限
            -hr: 王xx,王xx     :招员工,开除员工
            -开发:张xx,李xx: 看代码 开发代码,删除代码
            -总裁:刘xx         :查看公司财报
        -rbac表设计
            -用户表:用户和角色是    多对多
            -角色表(部门,组): 角色和权限  多对多
            -权限表:
            -用户和权限:多对多
            -总共6 张表,表示基于角色的访问控制:rbac+acl
            -django的后台管理就是基于rbac控制---》auth下有些表
                auth_user:# 用户表
                auth_group:# 组表(角色)
                auth_permission:# 权限表
                auth_group_permissions # 组和权限中间表
                auth_user_groups # 用户和组 中间表
                auth_user_user_permissions# 用户和权限多对多中间表
            -演示rbac权限控制
                -创建一个超级用户 root  123456 对网站有所有权限
                -创建一个用户[张三],创建一个组[测试组1],给测试组1加权限[book的增删查改]
                -张三登录,发现张三有 测试组1的所有权限
                -新增用户李四,没有任何组,登录后没有任何权限
                -把李四放到 测试组1 ,有测试组1的所有权限:查看图书,修改图书,删除图书
                
                -李四增加一个新增图书权限:
                    -新增图书权限 加入到 测试组1  张三也有这个权限,不好
                    -单独给李四增加一个 新增图书权限 
        
    3 ABAC:Attribute-Based Access Control,基于属性的访问控制
        -公司内部项目
        
        
        
  # 公司内部项目,所有项目几乎都要有rbac权限
    -基于django的admin做二次开发---》美化页面--》混合
    -django+vue--》实现基于rbac的访问控制
        -django-vue-admin
        -gin-vue-admin:
        -java:若依

 

vue介绍

  前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div id="app">

    <h1>{{s}}</h1>
</div>
</body>
<script>
    new Vue({
        el: '#app',
        data: {
            's': "hello world"
        }
    })


</script>
</html>