个人博客系列-后端项目-RBAC角色管理(6)

news2024/10/3 4:31:55

修改上一篇文章创建的用户表

## 用户表
from django.contrib.auth.hashers import make_password, check_password
from django.contrib.auth.models import AbstractBaseUser

class User(AbstractBaseUser):
	username = models.CharField(max_length=255, unique=True, verbose_name="手机号")
    password = models.CharField(max_length=255, unique=False, verbose_name="密码")
    is_vip = models.BooleanField(default=False,verbose_name="是否为vip")
    vip_expires_at = models.DateTimeField(auto_now_add=True,verbose_name="vip过期时间")
    is_active = models.BooleanField(default=True)
    USERNAME_FIELD = 'username'

    def set_password(self, raw_password):
        self.password = make_password(raw_password)

    def check_password(self, raw_password):
        return check_password(raw_password, self.password)

    class Meta:
        db_table = "blog_user"
        verbose_name = "用户表"
        verbose_name_plural = verbose_name

角色权限表

角色表

# 角色表
class Role(models.Model):
    role_name = models.CharField('角色名字', max_length=16)

    class Meta:
        db_table = "blog_role"
        verbose_name = "角色表"
        verbose_name_plural = verbose_name


# 权限表
class Access(models.Model):
    name = models.CharField('用户权限名称', max_length=256)
    path = models.CharField('用户权限路由', max_length=256)
    method = models.CharField('用户权限请求方式', max_length=16)
    types = models.CharField('权限类型', blank=True, null=True, max_length=10)  # 菜单权限和api权限

    class Meta:
        db_table = "blog_access"
        verbose_name = "权限表"
        verbose_name_plural = verbose_name


# 用户-角色  多对多
class UserRole(models.Model):
    user_id = models.IntegerField('用户ID', null=True, blank=True)
    role_id = models.IntegerField('角色ID', null=True, blank=True)

    class Meta:
        db_table = "blog_user_role"
        verbose_name = "用户角色表"
        verbose_name_plural = verbose_name



# 角色-权限 多对多
class RoleAccess(models.Model):
    role_id = models.IntegerField('角色ID', null=True, blank=True)
    acc_id = models.IntegerField('权限ID', null=True, blank=True)

    class Meta:
        db_table = "blog_role_access"
        verbose_name = "角色权限表"
        verbose_name_plural = verbose_name

在settings.py中配置自定义用户模型

在这里插入图片描述

数据库迁移

python manage.py makemigrations
python manage.py migrate 

在app:userauth的视图中写一个获取用户信息的接口

## views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from userauth.models import User
from systemauth.models import Role, Access, UserRole, RoleAccess

class UserInfoView(APIView):
    def post(self, request,*args, **kwargs):
        print('获取用户信息',request.user.username)
        # 存入session中,并返回给前端一份
        # 后期存入redis, 有助于减少mysql数据库压力,增加响应速度
        user_info = User.objects.get(username=request.user.username)  # 用户信息
        role_info = UserRole.objects.filter(user_id=user_info.id)       # 用户角色信息,一个用户可以有多个角色
        role_id_lst = [role.id for role in role_info]
        role_access_info = RoleAccess.objects.filter(role_id__in=role_id_lst)
        access_id_lst = [access.acc_id for access in role_access_info]
        access_info = Access.objects.filter(id__in=access_id_lst)
        permission_info = list()
        for access in access_info:
            permission_info.append({
                'name': access.name,
                'path': access.path,
                'method': access.method,
                'types': access.types
            })
        request.session['permission_info'] = permission_info
        return Response({'permission_info': request.session.get('permission_info')})

在utils目录中编写权限中间件permission.py

## permission.py
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse

# RBAC权限中间件
class PermissionMiddleware(MiddlewareMixin):
    def process_request(self, request):
        print('RABC权限中间件')
        request_path = request.path

        # 设置一些必要的路由白名单
        white_lst = ['/userauth/login/', "/userauth/userinfo/"]
        if request_path in white_lst:
            return None                          # 返回None表示通过验证
        # 请求的接口路由是否在权限范围内
        permission_info = request.session.get('permission_info',[])  # 从session中获取用户权限信息
        permission_api_lst = [info.get('path') for info in permission_info]
        if request_path in permission_api_lst:
            return None
        return HttpResponse("您没有访问权限")

在settings.py中配置自定义权限中间件

在这里插入图片描述

在表中配置一些测试数据,然后用postman进行测试。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1505060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day-18 猜数字游戏

1.由于两个数字位数相同,所以可以遍历字符串吧,找出公牛个数 2.在通过两个数组分别统计两个数字0-9的个数 3.Math.min(arr1[i],arr2[i])即为对应数字的奶牛个数 code class Solution {public String getHint(String secret, String guess) {int arr1[]n…

C++进阶:详细讲解继承

现在也是结束了初阶部分的内容,今天开始就进入进阶部分了。一刻也没有为初阶的结束而哀悼,立刻赶来“战场”的是进阶部分里的继承 文章目录 1.继承的概念和定义1.1继承的概念1.2继承的定义1.2.1继承的格式1.2.2再讲访问限定符(详讲protected)1.2.3**继承…

Android14之解决报错:No module named selinux(一百九十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

HTML静态网页成品作业(HTML+CSS)——花主题介绍网页设计制作(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…

数据科学中的Python:NumPy和Pandas入门指南【第121篇—NumPy和Pandas】

数据科学中的Python:NumPy和Pandas入门指南 数据科学是当今数字时代中的一个重要领域,而Python是数据科学家们最喜爱的编程语言之一。在这篇博客中,我们将介绍Python中两个强大的库——NumPy和Pandas,它们在数据处理和分析中发挥…

mysql | 查询数据的过程|优化-->索引 |存储引擎

查询的过程 首先确认mysql 服务器是否启动 systemctl mysqld status 登录连接 mysql -h i p − u ip -u ip−uuser -p (-h 指定服务器ip -u 指定用户名 -p 指定密码) mysql 数据包 经过抓包分析(mysql包其实就是基于tcp协议 3306端口) 传输采用mysql 协议&#xff0…

【探索C++容器:set和map的使用】

[本节目标] 1. 关联式容器 2. 键值对 3. 树形结构的关联式容器 1. 关联式容器 在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C11)等,这些容器统称为序列式容器,因为其底层为…

【Tauri】(4):整合Tauri和actix-web做本地大模型应用开发,可以实现session 登陆接口,完成页面展示,进入聊天界面

1,视频地址 https://www.bilibili.com/video/BV1GJ4m1Y7Aj/ 【Tauri】(4):整合Tauri和actix-web做本地大模型应用开发,可以实现session 登陆接口,完成页面展示,进入聊天界面 使用国内代理进行加…

农场管理小程序|基于微信小程序的农场管理系统设计与实现(源码+数据库+文档)

农场管理小程序目录 目录 基于微信小程序的农场管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、农场信息管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 五、核心代码 七、最新计算机毕设选题推荐 八、源码获取&#x…

族群争霸休闲养成小游戏

​游戏概述: 在一个由自然力量支配的幻想世界中,狼族与羊族的战争永无止境。 人族在两者之间寻求和平,建立起坚固的城墙,同时捕捉狼与羊来增强自身实力。 神族则在幕后观察,偶尔以神技介入战场,影响战局…

如何通过隐藏服务器真实IP来防御DDOS攻击

我们知道,服务器对外提供服务,基本上都是放置在公网上的。所以说服务器放置在公网上会面临很多攻击,如果不做好必要的防护措施,服务器被人攻击只是时间上的问题。 而我们面临的众多攻击中,DDoS攻击是最常见同时也是影响…

CSS顶部与JS后写:网页渲染的奥秘

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【linux】01 :虚拟机,Linux系统,远程连接Linux系统

导入:常见操作系统有哪些? PC端:Windows,Linux,MacOS 移动端:Android、IOS、鸿蒙系统 一、Linux 系统的组成 由Linux 系统内核和系统级应用程序两部分组成。 内核提供系统最核心的功能,如:调度 CPU 、调度…

Android Studio在导入项目后编译出现java版本错误解决方法

打开新项目时出现一下错误: Unsupported Java,Your build is currently configured to use Java 17.0.9 and Gradle 5.6.4. 这说明使用的java版本过高,而 gradle5.6.4对应的是java8,最新安装的编译器java版本是17 解决方法是为项…

C语言————字符函数与字符串函数

在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了⼀系列库函数,如追加,拷贝,替换等等接下来我们就学习⼀下这些函数,并且自实现。 gets 这个指令大家…

IntelliJ IDEA 2020.2.4试用方法

打开idea,准备好ide-eval-resetter压缩包。 将准备好的压缩包拖入idea中 选中弹窗中的自动重置选项,并点击重置 查看免费试用时长

【Docker安装教程】Docker安装Redis详解

安装Redis前我们必须要保证Docker运行OK,如何安装Docker参考《CentOS 7 上的 Docker 安装与配置》 步骤 1: 拉取 Redis 镜像 首先,确保你已经安装了 Docker。然后,使用以下命令拉取最新的 Redis 镜像: docker pull redis](http…

【Pytorch】进阶学习:深入解析 sklearn.metrics 中的 classification_report 函数---分类性能评估的利器

【Pytorch】进阶学习:深入解析 sklearn.metrics 中的 classification_report 函数—分类性能评估的利器 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合…

《互联网的世界》第五讲-信任和安全(第一趴:物理世界的非对称加密装置)

信任和安全的话题过于庞大,涉及很多数学知识,直接涉及 “正事” 反而不利于理解问题的本质,因此需要先讲一个前置作为 part 1。 part 1 主要描述物理世界的信任和安全,千万不要觉得数字世界是脱离物理世界的另一天堂,…

【C语言】字符指针

在指针的类型中我们知道有一种指针类型为字符指针char* 一般使用: int main() { char ch w; char *pc &ch; *pc w; return 0; } 还有一种使用方式,如下: int main() { const char* pstr "hello bit.";//这⾥是把⼀个字…