Gin框架中间件认证异常:未拦截无权限的Test接口请求
问题解决方法
你的问题出在认证失败时没终止请求流程——不管token是否正确,中间件最后都调用了c.Next(),导致Teste函数一定会被执行。解决起来很简单,在认证不通过的分支里加上c.Abort()中断请求链就行。
修改后的中间件代码如下:
func TokenAuthMiddleware() gin.HandlerFunc { err := godotenv.Load(".env") if err != nil { log.Fatal("Erro ao ler variaveis de ambiente") } requiredToken := os.Getenv("API_TOKEN") if requiredToken == "" { log.Fatal("Por favor, defina a variavel API_TOKEN") } return func(c *gin.Context) { token := c.Request.FormValue("api_token") if token == "" { c.JSON(http.StatusBadRequest, gin.H{"message": "Token deve ser preenchido"}) c.Abort() // 中断请求,不让后续的Teste函数执行 return } else if token != requiredToken { c.JSON(http.StatusBadRequest, gin.H{"message": "Token invalido"}) c.Abort() // 中断请求,不让后续的Teste函数执行 return } // 只有认证通过才继续走流程 c.Next() } }
额外优化建议
加载环境变量的逻辑不用放在中间件外层,虽然TokenAuthMiddleware()在程序启动时只会执行一次,但移到main函数里会更清晰,避免逻辑分散:
func main() { // 先加载并校验环境变量 err := godotenv.Load(".env") if err != nil { log.Fatal("Erro ao ler variaveis de ambiente") } requiredToken := os.Getenv("API_TOKEN") if requiredToken == "" { log.Fatal("Por favor, defina a variavel API_TOKEN") } api := gin.New() v1 := api.Group("v1") v1.Use(func(c *gin.Context) { token := c.Request.FormValue("api_token") if token == "" { c.JSON(http.StatusBadRequest, gin.H{"message": "Token deve ser preenchido"}) c.Abort() return } else if token != requiredToken { c.JSON(http.StatusBadRequest, gin.H{"message": "Token invalido"}) c.Abort() return } c.Next() }) v1.GET("/", Teste) api.Run() }
这样环境变量只在启动时加载一次,代码逻辑更集中,维护起来也方便。
内容的提问来源于stack exchange,提问作者Guilherme Rodrigues
相关产品推荐
相关产品推荐

