【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(七)角色菜单鉴权

本文主要是介绍【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(七)角色菜单鉴权,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

查看前几篇内容:

第一篇:【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(一)搭建项目

第二篇:【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(二)日志输出中间件、校验token中间件、配置路由、基础工具函数。

第三篇:【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(三)日志管理(登录日志、操作日志)、用户登录模块

第四篇:【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(四)用户管理、部门管理模块

第五篇:【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(五)角色管理、菜单管理模块

第六篇:【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(六)字典管理、安全设置模块

前言

前面讲角色和菜单模块的时候,没有提到鉴权相关的,后面我才想起来用户请求接口需要鉴权😂所以这篇来补充。

菜单鉴权

一般来说,设计菜单权限时,都是用角色来关联的,就是一个角色拥有哪些菜单(包括了目录、菜单、按钮),有这些菜单,才能进行相应的操作。

就比如下面的这些菜单:

在这里插入图片描述

需要将这些菜单分配给角色,那么这个角色对应的用户才能有操作这些菜单的权限。比如查看用户、新增用户、删除用户、修改用户等等这些操作权限。

在这里插入图片描述

而这些操作都有对应的接口,查看用户调用的是哪个接口、新增用户调用哪个接口等等。所以菜单权限也相当于接口权限,有这个菜单的权限,才能调用这个菜单对应的接口,通过接口,我们才可以操作数据。

在Java中,springboot项目菜单鉴权一般是通过 注解+aop切面 或者 注解+拦截器 的方式来实现。比如 注解+拦截器 实现:

注解:

在这里插入图片描述

拦截器中:

在这里插入图片描述

实现

go中,我也想用类似的方式实现,拦截器好说,就用中间件嘛,但是注解用什么代替?

使用GoFiber框架,注册路由时,那些post、get等方法,并不支持我们把每个接口对应的权限标识放进去。

在这里插入图片描述

这该怎么办?把目光放到中间件中,在中间件中,我们可以获取具体的请求接口,所以获取到的接口就是鉴权的关键。可是菜单表里并没有存储每个菜单或按钮的接口路径,存的都是perms权限标识。根据请求接口判断的话,也无法确定这个接口对应哪个权限标识。

思路

注册路由时,虽然post、get等方法,不支持我们把接口对应的权限标识放进去,但是我们是不是可以用一个全局变量把接口和权限标识给存起来,然后在中间件中根据接口,去这个全局变量中拿到接口对应的权限标识?

诶,这么一想好像确实行得通哦,所以为了实现这个思路,我们注册路由的代码需要重构亿下。

然后拿到了接口的权限标识,我们是不是得跟当前用户拥有的权限标识进行对比?

实现

为了方便我们存储接口和权限标识,我们可以自定义一个结构体来扩展路由信息,以便在定义路由时将权限标识、接口地址、接口处理函数关联起来;

同时再定义一个map全局变量,key为string类型,value就是我们自定义的结构体类型,存储接口和扩展的路由信息,方便我们在中间件中根据接口拿到路由信息。

我们将这个结构体和全局变量定义在 base_model.go 中:

在这里插入图片描述

然后定义路由的扩展信息时,在 router.go 文件中:

在这里插入图片描述

定义好了路由的扩展信息之后注册路由,同样在 router.go 文件中:

在这里插入图片描述

RouteApi 这个变量中,存好了需要用到的数据后,在中间件中,就可以去这个变量里面拿:

在这里插入图片描述

这样就实现了菜单(接口)鉴权。



这次的改动比较多,除了注册路由的方式重构了之外,还有需要考虑权限标识的存储和获取。因为绝大多数接口都需要鉴权,每次调用接口获取角色的权限标识时,如果每次都从数据库中查询,太浪费数据库性能了,所以可以选择将权限标识存到缓存中。而将权限标识存到缓存中又需要解决:数据库的角色和权限标识更新了,那缓存中也需要更新才能保证数据库数据和缓存数据的一致性


1、根据角色获取对应的权限标识

  • 先判断redis缓存中,有没有存储权限标识:
    • 没有就去数据库查询,查询全部角色的权限标识,将查询结果处理成指定格式,存进redis中;
    • 有就直接去redis中拿。

在这里插入图片描述

在这里插入图片描述


2、保证数据库数据和缓存数据的一致性

  • 新增或修改角色与菜单关联时,也需要更新redis中的角色与权限关联
  • 修改菜单,改了菜单的权限标识时,也需要更新redis中对应的权限标识
  • 删除角色时,也需要删除redis中对应角色的权限标识缓存

在这里插入图片描述

最后

改动比较多,所以就不放全部代码了,大家可以根据我的内容参考一下,如果需要完整代码的,可以点下面的链接

源码

Gitee:点我查看,记得给俺点个星星~


好啦,以上就是本篇文章的全部内容啦,欢迎大家多多点赞、Star 支持下哦,后续我还会更新go相关的文章的,所以可以关注我,不迷路~

这篇关于【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(七)角色菜单鉴权的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/618991

相关文章

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

使用DeepSeek搭建个人知识库(在笔记本电脑上)

《使用DeepSeek搭建个人知识库(在笔记本电脑上)》本文介绍了如何在笔记本电脑上使用DeepSeek和开源工具搭建个人知识库,通过安装DeepSeek和RAGFlow,并使用CherryStudi... 目录部署环境软件清单安装DeepSeek安装Cherry Studio安装RAGFlow设置知识库总

Linux搭建Mysql主从同步的教程

《Linux搭建Mysql主从同步的教程》:本文主要介绍Linux搭建Mysql主从同步的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux搭建mysql主从同步1.启动mysql服务2.修改Mysql主库配置文件/etc/my.cnf3.重启主库my

国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)

《国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)》本文给大家利用deepseek模型搭建私有知识问答库的详细步骤和遇到的问题及解决办法,感兴趣的朋友一起看看吧... 目录1. 第1步大家在安装完ollama后,需要到系统环境变量中添加两个变量2. 第3步 “在cmd中

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性