52 lines
1.4 KiB
Go
52 lines
1.4 KiB
Go
package middleware
|
|
|
|
import (
|
|
"github.com/goravel/framework/contracts/http"
|
|
"github.com/goravel/framework/facades"
|
|
|
|
"goravel/app/http/helpers"
|
|
"goravel/app/http/trans"
|
|
"goravel/app/models"
|
|
"goravel/app/utils"
|
|
)
|
|
|
|
func Blacklist() http.Middleware {
|
|
return func(ctx http.Context) {
|
|
// 排除登录接口,避免管理员被封禁后无法登录
|
|
path := ctx.Request().Path()
|
|
if path == "/api/admin/login" || path == "/api/admin/login/captcha" {
|
|
ctx.Request().Next()
|
|
return
|
|
}
|
|
|
|
// 获取真实IP地址
|
|
realIP := helpers.GetRealIP(ctx)
|
|
|
|
// 查询所有启用的黑名单记录
|
|
var blacklists []models.Blacklist
|
|
if err := facades.Orm().Query().Where("status", 1).Get(&blacklists); err != nil {
|
|
// 如果查询失败,记录错误但继续处理请求(避免影响系统正常运行)
|
|
facades.Log().Errorf("Blacklist middleware: Failed to query blacklists: %v", err)
|
|
ctx.Request().Next()
|
|
return
|
|
}
|
|
|
|
// 检查IP是否在黑名单中
|
|
for _, blacklist := range blacklists {
|
|
if utils.IsIPInBlacklist(realIP, blacklist.IP) {
|
|
// IP在黑名单中,拒绝访问
|
|
facades.Log().Warningf("Blacklist middleware: IP %s blocked by blacklist ID %d", realIP, blacklist.ID)
|
|
_ = ctx.Response().Json(http.StatusForbidden, http.Json{
|
|
"code": http.StatusForbidden,
|
|
"message": trans.Get(ctx, "ip_blocked"),
|
|
}).Abort()
|
|
return
|
|
}
|
|
}
|
|
|
|
// IP不在黑名单中,继续处理请求
|
|
ctx.Request().Next()
|
|
}
|
|
}
|
|
|