go中间件实现登录验证
一、概述
在java中可以使用过滤器、拦截器实现登录验证(验证token的有效性、判断哪些路径需要登录、哪些路径不需要登录)等等的一些公共性的验证操作。
go语言中有没有类似的东西呢,答案是有的,go语言中可以使用中间件来完成这个操作。
接下来使用gin+中间件的形式来验证token的有效性(公共/通用验证)
验证步骤:
1.登录时生成token
2.添加中间件
3.在中间件中验证token的有效性,并判断哪些接口可以不登录访问,哪些接口必须登录后才能访问
二、代码示例
1.调用登录接口生成token
// 登录 func loginHandler(context *gin.Context) { var user entity.User err := context.ShouldBindJSON(&user) fmt.Println("登录参数:", user) if len(user.Phone) == 0 || len(user.Pwd) == 0 { response.ShowError(400, "用户名密码不能为空", context) return } if err != nil { response.ShowError(400, "参数异常:"+err.Error(), context) return } userTable := connectMySql().Table("user").Debug() var count int64 err1 := userTable.Where("phone=?", user.Phone).Count(&count).Error fmt.Println("是否有记录:", count) if count <= 0 || err1 != nil { response.ShowError(200, "没有此用户", context) return } var users []entity.User //加上debug说明输出sql执行的操作(出于debug模式) err2 := userTable.Where("phone=? AND pwd=?", user.Phone, user.Pwd).Find(&users).Error fmt.Println(len(users)) fmt.Println(users) // err2 := userTable.Where(&entity.User{Phone: user.Phone, Pwd: user.Pwd}).Find(&users).Error if len(users) <= 0 || err2 != nil { response.ShowError(200, "用户名或密码不正确", context) return } //生成token mToken, err3 := token.CreateToken(users[0]) if err3 != nil { response.ShowError(200, "token生成失败", context) return } response.ShowSuccess(mToken, context) }
2.添加中间件
//使用中间件,其中CheckToken()中间件方法 router.Use(CheckToken())
3.在中间件中验证token
/ 中间件 func CheckToken() gin.HandlerFunc { return func(context *gin.Context) { fmt.Println("路径:", context.FullPath()) mPath := context.FullPath() strPaths := []string{//登录和注册接口放行 "/user/login", "/user/register", } flag := false for _, value := range strPaths { if value == mPath { flag = true } } if !flag { fmt.Println("不包含") authorization := context.GetHeader("Authorization") //获取token fmt.Println("header:Authorization", authorization) //||!strings.HasPrefix(authorization,) if authorization == "" { response.ShowError(401, "token为空", context) context.Abort() return } //解析token mToken, claims, err := token.ParseToken(authorization) fmt.Println("token:", mToken) fmt.Println("claims:", claims) if err != nil || !mToken.Valid { //解析错误或者token过期 response.ShowError(401, "token过期/错误"+err.Error(), context) context.Abort() return } context.Set("id", claims.Id) } else { fmt.Println("包含") } context.Next() // claims.Id // return claims.Id, nil }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2023-01-29 ubuntu20+nginx-rtmp环境搭建