权限控制,RBAC

发布时间 2023-05-31 16:16:51作者: 橘子熊何妨

权限控制

# ACL(访问控制列表)的权限控制:(针对互联网用户的产品)
	用户表
    id    name      password
    1     zhangsan   123
    
    权限表
    id   user_id    权限
    1     1         评论权限
    2     1          发抖音权限

    张三:[评论权限,发抖音权限]
# RBAC(Role-Based Access Control)基于角色的访问控制:(针对于公司内部项目)
权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便

# django的auth其实就实现了基于角色的访问控制---》通过表控制的
	-auth_user :用户表,存用户信息
    -auth_group:组,角色,存放角色信息
    -auth_permission:权限,存放权限信息
    # 分析:一个组(角色)中,有多个用户,一个用户,属于多种角色----》多对多
    -auth_user_groups:用户和组的多对多中间表
    # 分析:一个组,可能有多个权限,一个权限,也可能属于多个组---》多对多
    -auth_group_permissions:组和权限的多对多中间件
    # django,多了张表:auth_user_user_permissions
    # 分析:一个用户,可以有多个权限,一个权限,可以分配个多个用户---》多对多
    -auth_user_user_permissions:用户和权限多对多中间表
    

我们开发中做权限控制

# python开发,公司内部项目多,使用基于角色的访问控制的权限,比较多

# python+django 开发出一套公司内部项目,要带rbac的权限控制
	-1 基于django的auth+admin 快速开发,有更多操作,但是没学
    -2 基于django的auth+admin+第三方美化 快速开发
    	-国内的:simple-ui,xadmin(弃用了)
        -国外的:
   	-3 基于django+vue+自定制权限 
    	-djagno-vue-admin :第三方开源
        
     -4 完全自己写

基于django的auth+admin+第三方美化 快速开发

# 1 安装
pip3 install django-simpleui
# 2 配置文件配置,注册app
	INSTALLED_APPS = [
      'simpleui',
      ...
  ]
    
# 3 菜单栏定制
# 4 自定义菜单和页面
# 5 自定义按钮
# 6 切换图标
# 7 首页显示的隐藏


# 其实它可以开发出任意各种功能

djagno-vue-admin演示

# https://gitee.com/liqianglog/django-vue-admin

drf大回顾

1 drf入门规范
	-前后端开发模式:混合,分离
    -API接口:地址,请求方法,请求参数,返回值
    -postman的使用
    -序列化和反序列化
    -restful规范
    	-http响应状态码
        
    -想在django中写符合规范的接口
    -djangorestframework:django的app
    -快速使用
    
2 CBV源码分析
	-路由中 视图类.as_viwe()--->django的View的as_viwe()---->执行结果 view内存地址----》请求来了,路由匹配成功----》view(request)---->return self.dispatch()--->View的dispatch---》通过反射,不同的请求会执行视图类中跟请求同名的方法


3 APIView执行流程
	# APIView 继承了View
	# 视图类:class BookView(APIView):
    # 路由中 视图类.as_viwe()--->drf的APIView的as_viwe()--->调用父类的as_view,去除csrf---》View类的as_view内部的view闭包函数(加了个装饰器)---》view(request)---->return self.dispatch()---》APIView的dispatch()
    
    
    # 以后视图类,只要继承APIView及其子类
   
    
    # 装饰器的本质原理
    @装饰器  # add=装饰器(add)
    def add()
    # 闭包函数

    
    
    
    
# 补充
	类中:self
    类中:super()

多方式登陆接口

class Userinfo(AbstractUser):
    phone = models.CharField(max_length=64)

视图类

from rest_framework.response import Response
from rest_framework.viewsets import ViewSet
from .serializer import Loginserializer


class login(ViewSet):
    def login(self, request):
        ser = Loginserializer(data=request.data)
        if ser.is_valid():
            user = ser.user
            token = ser.token
            return Response({'code': 200, 'msg': '成功', 'username': user.username, 'token': token})
        else:
            return Response({'code': 201, 'msg': ser.errors})

序列化

import re

from rest_framework import serializers
from rest_framework.exceptions import ValidationError

from rest_framework_jwt.serializers import jwt_encode_handler, jwt_payload_handler

from .models import Userinfo


class Loginserializer(serializers.ModelSerializer):
    username = serializers.CharField()

    class Meta:
        model = Userinfo
        fields = ['username', 'password']

    def validate(self, attrs):
        username = attrs.get('username')
        password = attrs.get('password')
        if re.match(r'^1[3-9][0-9]{9}$', username):
            user = Userinfo.objects.filter(phone=username).first()
        elif re.match(r'^.+@.+$', username):
            user = Userinfo.objects.filter(email=username).first()
        else:
            user = Userinfo.objects.filter(username=username).first()
        if user and user.check_password(password):
            payload = jwt_payload_handler(user)
            token = jwt_encode_handler(payload)
            self.user = user
            self.token = token
            return attrs
        else:
            raise ValidationError('用户名或密码错误')

路由

from django.urls import path
from app01.views import *

urlpatterns = [
    path('login/', login.as_view({'post': 'login'})),
]