Gin 鉴权中间件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
func auth() gin.HandlerFunc {
return func(c *gin.Context) {
method := c.Request.Method

fullPath := c.FullPath()

// 只有登录接口不需要进行鉴权验证
if method != "POST" && fullPath != "/login" {
// 获取请求头的鉴权信息
token := c.GetHeader("Authorization")

// 基础的一个判断是否符合要求
if token == "" || len(token) != 32 {
c.AbortWithStatus(http.StatusUnauthorized)

return
}

// 查询 Redis 或者 MySQL 等验证是否存在和获取基本信息
// 不存在的话抛出 AbortWithStatus ,中间件会结束请求的

// 假设你已经验证 token 是可用的,同时获取到了用户信息
uid := 1

// 保存鉴权信息
c.Set("uid", uid)
}

// 前置中间件
// ↑↑↑↑↑↑↑↑↑↑
c.Next()
// ↓↓↓↓↓↓↓↓↓↓
// 后置中间件
}
}

如何使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package main

import (
"net/http"
"github.com/gin-gonic/gin"
)

func main() {
r := gin.Default()

// 当全局中间件
r.Use(auth())

g := r.Group("/v2")

// 路由组中间件
g.Use(auth())

r.GET("/user", func(c *gin.Context) {
// MustGet 和 Get 区别,MustGet 不存在会抛出 panic,Get 返回两个参数,第二个判断是不是存在
uid := c.MustGet("uid")

c.String(http.StatusOK, uid.(string))
})

r.Run("127.0.0.1:9000")
}

func auth() gin.HandlerFunc {
...
}
往上