中間件提供了一種方便的機制來過濾進入應用程序的 HTTP 請求。例如,`GoHub` 包含一個驗證用戶身份的中間件。 如果用戶未能通過認證,中間件會把用戶重定向到登錄頁面。 反之,用戶如果通過驗證, 中間件將把請求進一步轉發到應用程序中。
當然,除了驗證身份外,還可以編寫其他的中間件來執行各種任務。例如:`CORS` 中間件可以負責為所有的應用返回的 `responses` 添加合適的響應頭。日志中間件可以記錄所有傳入應用的請求。
`GoHub` 自帶了一些中間件,包括身份驗證、限流器 、HTTP請求日志等。所有的這些中間件都位于`app/http/middlewares`目錄。
## 定義中間件
我們來自己定義一個`JWT`鑒權的中間件
```
// Package middlewares Gin 中間件
package middlewares
import (
"github.com/spf13/cast"
"gohub/app/models/user"
"gohub/pkg/jwt"
"gohub/pkg/response"
"net/http"
"github.com/gin-gonic/gin"
)
// AuthJWT 驗證用戶身份
func AuthJWT() gin.HandlerFunc {
return func(c *gin.Context) {
// 從標頭 Authorization:Bearer xxxxx 中獲取信息,并驗證 JWT 的準確性
claims, err := jwt.NewJWT().ParserToken(c)
// JWT 解析失敗,有錯誤發生
if err != nil {
response.ShowError(c, http.StatusUnauthorized, err.Error())
c.Abort()
return
}
// JWT 解析成功,設置用戶信息
userModel := user.Get(cast.ToString(claims.UserID))
if userModel.ID == 0 {
response.ShowError(c, http.StatusUnauthorized, "用戶不存在")
c.Abort()
return
}
// 將用戶信息存入 gin.context 里,后續 auth 包將從這里拿到當前用戶數據
c.Set("user_id", userModel.GetStringID())
c.Set("user_name", userModel.Name)
c.Set("user", userModel)
c.Next()
}
}
```
*****
### 在路由使用中間件
```
userRouter.GET("/profile/", middlewares.AuthJWT(), handler.UserProfile)
userRouter.POST("/update", middlewares.AuthJWT(), handler.UpdateUserProfile)
```
*****
### 在路由組使用中間件
```
// 所有的 v1 版本的路由都將存放到這里
v1 := r.Group("/v1")
// 全局限流中間件:每小時限流。這里是所有 API (根據 IP)請求加起來。
v1.Use(middlewares.AuthJWT())
{
v1.GET("/profile/", handler.UserProfile)
}
```
## 全局中間件
如果你希望中間件在應用處理每個`HTTP`請求期間運行,只需要在 `bootstrap/route.go`中的`registerGlobalMiddleWare`方法添加這個中間件即可,例如:
```
// 全局中間件
func registerGlobalMiddleWare(router *gin.Engine) {
router.Use(
// 記錄HTTP日志
middlewares.Logger(),
// 全局異常處理
middlewares.Recovery(),
// 強制 User Agent 中間件
middlewares.ForceUA(),
)
}
```
- 序言
- 基礎
- 安裝GoHub
- 目錄結構
- 開發規范
- 部署項目
- 架構
- 架構總覽
- 生命周期
- 配置
- 配置介紹
- 配置目錄
- 配置格式
- 配置加載
- 讀取配置
- 動態配置
- 環境變量配置
- 路由
- 路由模式
- 路由定義
- 路由參數
- 路由分組
- 路由限流
- 路由拆分
- 控制器
- 控制定義
- 控制器初始化
- 中間件
- Make創建控制器
- 請求
- 請求信息
- 數據庫
- 連接數據庫
- 基本使用
- Make創建模型
- 日志
- 介紹
- 日志驅動
- 日志寫入
- HTTP日志
- 數據庫請求日志
- 錯誤和調試
- Debuger調試器
- 驗證
- 驗證器
- 驗證規則
- Make創建驗證器
- 雜項
- 緩存
- 分頁
- 驗證碼
- CURL請求
- 命令行
- 基礎知識
- console 包
- Cobra 基礎
- 命令行模式
- 附錄
- 配置參考
- 第三方依賴庫