56 lines
1.3 KiB
Go
56 lines
1.3 KiB
Go
package middleware
|
|
|
|
import (
|
|
"context"
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/gogf/gf/v2/net/ghttp"
|
|
"github.com/gogf/gf/v2/os/gtime"
|
|
"github.com/gogf/gf/v2/text/gstr"
|
|
"golang.org/x/time/rate"
|
|
)
|
|
|
|
// Logger 中间件
|
|
func Logger(r *ghttp.Request) {
|
|
startTime := gtime.TimestampMilli()
|
|
r.Middleware.Next()
|
|
endTime := gtime.TimestampMilli()
|
|
g.Log().Infof(r.GetCtx(),
|
|
"request: %s %s | status: %d | time: %dms",
|
|
r.Method,
|
|
r.URL.Path,
|
|
r.Response.Status,
|
|
endTime-startTime,
|
|
)
|
|
}
|
|
|
|
var rateLimit = g.Cfg().MustGet(context.TODO(), "rate.limit").Int()
|
|
var rateBurst = g.Cfg().MustGet(context.TODO(), "rate.burst").Int()
|
|
var limiter = rate.NewLimiter(rate.Limit(rateLimit), rateBurst)
|
|
|
|
func Limiter(r *ghttp.Request) {
|
|
if !limiter.Allow() {
|
|
r.Response.WriteStatusExit(429) // Return 429 Too Many Requests
|
|
r.ExitAll()
|
|
}
|
|
r.Middleware.Next()
|
|
}
|
|
func Auth(r *ghttp.Request) {
|
|
token := r.Header.Get("Authorization")
|
|
if token == "" || !gstr.HasPrefix(token, "Bearer ") {
|
|
r.Response.WriteStatusExit(401, "Unauthorized")
|
|
return
|
|
}
|
|
|
|
// 验证 token
|
|
if !validateToken(gstr.SubStrFrom(token, "7")) {
|
|
r.Response.WriteStatusExit(401, "Unauthorized")
|
|
return
|
|
}
|
|
|
|
r.Middleware.Next()
|
|
}
|
|
func validateToken(token string) bool {
|
|
// 实现 token 验证逻辑
|
|
return token == "valid-token"
|
|
}
|