go基于redis+jwt进行用户认证和权限控制

go基于redis+jwt进行用户认证和权限控制:

基于 jwt 实现用户认证

基于 redis 记录用户的角色和权限

效果

实现 用户认证 和 权限控制

核心实现

下面的例子:有三个用户,分别为三个角色:admin、user、manager

路由: 在 /manage 下的路由,只有 manage 权限下的角色可以访问(这里是admin、manager)

redis存储角色和权限

go 复制代码
func SetIsMember(key, value string) bool {
	return Rdb.SIsMember(key, value).Val()
}

middleware进行token解析和校验

go 复制代码
func AuthMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 解析token,获取用户权限信息和id
		token := c.Request.Header.Get("Authorization")
		if token == "" {
			c.AbortWithStatusJSON(200, gin.H{"code": 401, "msg": "token为空"})
		}
		if strings.Contains(token, "Bearer") {
			token = strings.Split(token, " ")[1]
		}
		mc, err := jwt.ParseMytoken(token)
		if err != nil {
			c.AbortWithStatusJSON(200, gin.H{"code": 401, "msg": "token解析失败"})
		}
		if mc == nil {
			fmt.Println("mc is nil")
			c.Abort()
		}
		username := mc.Username
		auth := mc.Auth
		// 将用户信息和权限信息保存到上下文中,以便后续使用
		c.Set("username", username)
		c.Set("auth", auth)
		// 通过 记录 用户 - 角色 - 权限 的映射关系,来判断用户是否有访问该路由的权限。
		// 调用 redis 校验路由和角色权限
		url := c.Request.URL.Path
		permission := strings.Split(url, "/")[1]
		if err != nil {
			c.AbortWithStatusJSON(200, gin.H{"code": 401, "msg": "permission解析失败"})
		}
		key := fmt.Sprintf("permission:%s", permission)
		if redis.SetIsMember(key, auth) {
			c.Next()
		} else {
			c.AbortWithStatusJSON(200, gin.H{"code": 401, "msg": "权限不足"})
		}
	}

}

相似 权限控制做法

直接将角色和权限表存到数据库中,然后在查询的时候进行关联查询(或者直接将关联查询到的结果放到一个视图中)

进阶 权限控制(Casbin框架--用户授权)

后续...

相关推荐
全栈软件开发2 小时前
最新版T5友价互站网源码商城PHP源码交易平台 完整带手机版源码网系统源码
android·开发语言·php
Mos_x2 小时前
关于我们的python日记本
开发语言·python
The Sheep 20232 小时前
Dotnet-Dapper的用法
java·开发语言
马克学长3 小时前
SSM基于Java的医疗器械销售系统oy281(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·开发语言·用户管理·ssm 框架·医疗器械销售系统
lqj_本人3 小时前
Rust与Go:现代系统编程语言的深度对比
开发语言·golang·rust
星释3 小时前
Rust 练习册 :Macros与宏系统
开发语言·后端·rust
l1t3 小时前
利用短整数类型和部分字符串优化DuckDB利用数组求解数独SQL
开发语言·数据库·sql·duckdb
权泽谦4 小时前
从零搭建一个 PHP 登录注册系统(含完整源码)
android·开发语言·php
PieroPc4 小时前
用python Streamlit 做个RapidOCR 文本识别系统
开发语言·python·ocr
whltaoin4 小时前
【JAVA全栈项目】弧图图-智能图床SpringBoot+MySQL API接口结合Redis+Caffeine多级缓存实践解析
java·redis·spring·缓存·caffeine·多级缓存