尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Gin-JWT认证与授权方案从Token到RBAC权限控制
Gin-JWT认证与授权方案从Token到RBAC权限控制文章导语JWTJSON Web Token是现代Web服务的身份认证标准。在Gin框架中集成JWT看似简单但涉及Token刷新、黑名单、多设备登录、RBAC权限控制等实际需求时就需要更完善的设计。本文将从基础到进阶构建一个生产级的Gin JWT认证授权系统。一、JWT基础实现importgithub.com/golang-jwt/jwt/v5// 自定义ClaimstypeCustomClaimsstruct{UserIDuintjson:user_idUsernamestringjson:usernameRolestringjson:rolejwt.RegisteredClaims}// 生成TokenfuncGenerateToken(userIDuint,usernamestring,rolestring,secret[]byte)(string,error){claims:CustomClaims{UserID:userID,Username:username,Role:role,RegisteredClaims:jwt.RegisteredClaims{ExpiresAt:jwt.NewNumericDate(time.Now().Add(24*time.Hour)),IssuedAt:jwt.NewNumericDate(time.Now()),Issuer:myapp,Subject:fmt.Sprintf(%d,userID),},}token:jwt.NewWithClaims(jwt.SigningMethodHS256,claims)returntoken.SignedString(secret)}// 解析TokenfuncParseToken(tokenStringstring,secret[]byte)(*CustomClaims,error){token,err:jwt.ParseWithClaims(tokenString,CustomClaims{},func(token*jwt.Token)(interface{},error){if_,ok:token.Method.(*jwt.SigningMethodHMAC);!ok{returnnil,fmt.Errorf(unexpected signing method: %v,token.Header[alg])}returnsecret,nil})iferr!nil{returnnil,err}ifclaims,ok:token.Claims.(*CustomClaims);oktoken.Valid{returnclaims,nil}returnnil,errors.New(invalid token)}二、Gin中间件集成funcAuthMiddleware(secret[]byte)gin.HandlerFunc{returnfunc(c*gin.Context){// 从Header获取TokenauthHeader:c.GetHeader(Authorization)ifauthHeader{c.AbortWithStatusJSON(401,gin.H{msg:请提供认证令牌})return}// Bearer Token格式parts:strings.SplitN(authHeader, ,2)iflen(parts)!2||parts[0]!Bearer{c.AbortWithStatusJSON(401,gin.H{msg:认证格式错误})return}claims,err:ParseToken(parts[1],secret)iferr!nil{c.AbortWithStatusJSON(401,gin.H{msg:令牌无效或已过期})return}// 将用户信息存入Contextc.Set(user_id,claims.UserID)c.Set(username,claims.Username)c.Set(role,claims.Role)c.Next()}}三、Token刷新机制// 双Token策略Access Token Refresh TokenfuncRefreshToken(c*gin.Context){varreqstruct{RefreshTokenstringjson:refresh_token binding:required}iferr:c.ShouldBindJSON(req);err!nil{c.JSON(400,gin.H{msg:参数错误})return}// 验证Refresh Tokenclaims,err:ParseToken(req.RefreshToken,refreshSecret)iferr!nil{c.JSON(401,gin.H{msg:Refresh Token无效})return}// 检查Refresh Token是否在黑名单ifisBlacklisted(claims.ID){c.JSON(401,gin.H{msg:Refresh Token已被撤销})return}// 生成新的Access TokennewToken,err:GenerateToken(claims.UserID,claims.Username,claims.Role,accessSecret)iferr!nil{c.JSON(500,gin.H{msg:生成Token失败})return}c.JSON(200,gin.H{access_token:newToken,expires_in:86400,})}四、RBAC权限控制// 权限常量const(RoleAdminadminRoleUseruser)// 权限中间件funcRequireRole(roles...string)gin.HandlerFunc{returnfunc(c*gin.Context){userRole,exists:c.Get(role)if!exists{c.AbortWithStatusJSON(403,gin.H{msg:权限不足})return}for_,role:rangeroles{ifuserRole.(string)role{c.Next()return}}c.AbortWithStatusJSON(403,gin.H{msg:权限不足})}}// 使用router:gin.Default()router.Use(AuthMiddleware(secret))adminGroup:router.Group(/admin)adminGroup.Use(RequireRole(RoleAdmin)){adminGroup.GET(/dashboard,adminDashboard)adminGroup.DELETE(/users/:id,adminDeleteUser)}userGroup:router.Group(/user)userGroup.Use(RequireRole(RoleUser,RoleAdmin)){userGroup.GET(/profile,userProfile)}五、Token黑名单Redis实现funcLogout(c*gin.Context){tokenString:extractToken(c)claims,_:ParseToken(tokenString,secret)// 将Token加入黑名单expiration:time.Until(claims.ExpiresAt.Time)err:rdb.Set(ctx,blacklist:claims.ID,1,expiration).Err()iferr!nil{c.JSON(500,gin.H{msg:登出失败})return}c.JSON(200,gin.H{msg:登出成功})}funcisBlacklisted(tokenIDstring)bool{exists,_:rdb.Exists(ctx,blacklist:tokenID).Result()returnexists0}六、全文总结JWT Gin中间件实现无状态认证双Token策略解决Token过期刷新问题RBAC中间件实现细粒度权限控制Redis黑名单实现Token主动失效验证签名算法防伪造七、技术进阶展望OAuth2.0与Gin的集成SSO单点登录在Go中的实现JWT的Ed25519签名算法参考文献JWT RFC 7519: https://tools.ietf.org/html/rfc7519golang-jwt: https://github.com/golang-jwt/jwtGin中间件文档Auth0 - JWT Best PracticesOWASP - Authentication Cheat Sheet
RELATED

相关推荐

真空回流炉风电变流器电路板回流炉应用指南与关键注意事项

真空回流炉风电变流器电路板回流炉应用指南与关键注意事项

半导体封装的神秘面纱——真空共晶焊接的奥秘你有没有想过,那些支撑起现代科技的半导体芯片们,是怎么被“穿”上保护衣的?😯 就像我们穿衣服一样,芯片也需要一个封装过程来保护它们免受外界的损害,而这个过…

📅 2026/10/27 19:27:59
优选乡墅赋能培训课程包含哪些内容,有什么作用?

优选乡墅赋能培训课程包含哪些内容,有什么作用?

优选乡墅赋能培训课程能助力学员掌握乡墅业务各环节知识与技能,湖北乡墅研究中心的课程体系完善,涵盖多方面内容。知识保障湖北乡墅研究中心提供运营标准赋能体系整套SOP全部手册,为学员提供全面、系统的理论知识依据。这些手册详细记录乡墅业…

📅 2026/10/24 19:49:49
Python多线程编程:安全停止线程的最佳实践

Python多线程编程:安全停止线程的最佳实践

Python多线程编程:安全停止线程的最佳实践关键词:Python多线程、线程安全、Event对象、守护线程、GIL适用场景:需要长期运行的后台线程、定时任务、同步服务难度等级:⭐⭐⭐(中级)一、问题背景在Python多线…

📅 2026/11/9 12:36:59
MORE NEWS

更多资讯

📰

考电工证都考科目在哪考?新手避坑全流程解析

考电工证都考科目在哪考?新手避坑全流程解析 你是不是也跟大多数人一样,听说要考电工证才能上岗,但不知道去哪报名,怕被中介坑?别急,这篇文章就是为你量身打造的。考电工证都考科目,报名流程、考试内容、通过率、在哪考、怎么准备,一文讲透。…

📰

高压电工证丢了补办多少钱 这些坑千万别踩

高压电工证丢了补办多少钱 这些坑千万别踩 实操考试心里没底怕挂科,这几乎是每个准备考高压电工证的人都会有的想法。尤其是在证书丢了补办的情况下,很多人既担心流程复杂,又怕重新考试时因为不熟悉而失败,耽误工作和收入。更关键的是,…

📰

南阳卧龙区建筑工人考电工证都考科目值不值得考

南阳卧龙区建筑工人考电工证都考科目值不值得考 之前考的证在外省能不能转过来?这是不少南阳卧龙区建筑工人心头的疑问。尤其是像你这样常年在外跑工地的,换地方、换项目、换公司是常有的事。证件能不能跟着你走,直接关系到能不能继续干下去。今天咱们就聊…

📰

阜宁电工证多少钱 怎么报名才能顺利通过

阜宁电工证多少钱 怎么报名才能顺利通过 你是不是学历不高,担心自己连电工证都报不上名?别急,今天我就从一个从业多年的视角,给你说说 阜宁电工证多少钱 ,怎么报名,怎么避免踩坑,还能顺利拿到证。 一、阜宁电工证多少钱?真实报价与报考门槛…

📰

协会电工证查询怎么操作?多少钱能搞定复审和报名

协会电工证查询怎么操作?多少钱能搞定复审和报名 证书过期了不知道怎么复审延期,这事儿真不是小事。特别是在施工现场,没有有效的电工证,不仅影响项目进度,还可能被执法部门处罚。现在很多人手里拿着旧证,但对 协会电工证查询…

📰

低压电工证试题xls内部消息:实操考试心里没底怕挂科?看这篇就够了

低压电工证试题xls内部消息:实操考试心里没底怕挂科?看这篇就够了 实操考试心里没底怕挂科,每次动手操作都像在赌一把,这不光是考试焦虑,更是对自身职业前景的担忧。你有没有发现,最近网上都在疯传【低压电工证试题xls】,这背后其实藏着很多…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬