Files
common/middleware/module_tenant_check.go

123 lines
3.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package middleware
import (
"context"
"encoding/json"
"fmt"
"gitee.com/red-future---jilin-g/common/beans"
"gitee.com/red-future---jilin-g/common/http"
"gitee.com/red-future---jilin-g/common/message"
"gitee.com/red-future---jilin-g/common/utils"
"github.com/gogf/gf/v2/database/gredis"
"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/util/gconv"
"time"
)
func ModuleTenantCheck(r *ghttp.Request) {
//将 http.Header 转换为 map[string]string
headers := make(map[string]string)
for k, v := range r.Request.Header {
if len(v) > 0 {
headers[k] = v[0]
}
}
// 检查是否是超级管理员
IsSuperAdmin, err := IsSuperAdmin(r.Context(), headers)
if err != nil {
SetResponseInfo(r.Context(), r, err)
}
// 如果是超级管理员,则不进行模块租户检查
if IsSuperAdmin.IsSuperAdmin {
r.Middleware.Next()
return
}
getUserInfo, err := utils.GetUserInfo(r.Context())
if err != nil {
SetResponseInfo(r.Context(), r, err)
}
exit := gconv.Int64(time.Minute * 1)
getEX, err := message.GetRedisClientTest("test").GetEX(r.Context(), fmt.Sprintf("module_tenant:tenantId-%v", getUserInfo.TenantId), gredis.GetEXOption{
TTLOption: gredis.TTLOption{
EX: &exit,
},
})
if err != nil {
SetResponseInfo(r.Context(), r, err)
}
// 获取模块key
moduleKey := g.Cfg().MustGet(context.Background(), "server.name")
if !g.IsEmpty(getEX.String()) {
list := make([]beans.ModuleTenant, 0)
if err = json.Unmarshal([]byte(getEX.String()), &list); err != nil {
SetResponseInfo(r.Context(), r, err)
}
var expireAt *gtime.Time
for _, value := range list {
if value.ModuleKey == moduleKey.String() {
expireAt = value.ExpireAt
break
}
}
// 缓存中有数据,检查是否过期
if !g.IsEmpty(expireAt) {
gt1 := gtime.New(time.Now())
gt2 := gtime.New(expireAt)
if !gt1.Before(gt2) {
SetResponseInfo(r.Context(), r, "您访问的模块已过期,请续期后再使用")
}
} else {
SetResponseInfo(r.Context(), r, "您未开通此模块,请开通后再使用")
}
} else {
// 缓存为空调用admin-go的Check接口检查模块开通状态
res, err := Check(r.Context(), headers, beans.ModuleTenantCheckReq{
ModuleKey: moduleKey.String(),
TenantId: gconv.Uint64(getUserInfo.TenantId),
})
if err != nil {
SetResponseInfo(r.Context(), r, err)
}
// 根据检查结果判断是否允许访问
if res.Status == "not_activated" {
SetResponseInfo(r.Context(), r, "您未开通此模块,请开通后再使用")
} else if res.Status == "expired" {
SetResponseInfo(r.Context(), r, "您访问的模块已过期,请续期后再使用")
}
}
r.Middleware.Next() // 继续执行后续中间件和路由处理
}
// SetResponseInfo 设置响应信息
func SetResponseInfo(ctx context.Context, r *ghttp.Request, message any) {
_ = ctx
r.Response.Status = 503
r.Response.WriteJsonExit(map[string]interface{}{
"success": false,
"code": 503,
"message": fmt.Sprintf("服务不可用:%s", message),
})
r.Exit()
}
// Check 调用admin-go服务检查模块开通状态
func Check(ctx context.Context, headerMap map[string]string, req beans.ModuleTenantCheckReq) (res *beans.ModuleTenantCheckRes, err error) {
if err = http.Get(ctx, "admin-go/api/v1/system/moduleTenant/check", headerMap, &res,
"moduleKey", req.ModuleKey,
"tenantId", req.TenantId,
); err != nil {
return
}
return
}
// IsSuperAdmin 调用admin-go服务检查是否是超级管理员
func IsSuperAdmin(ctx context.Context, headerMap map[string]string) (res *beans.IsSuperAdminRes, err error) {
if err = http.Get(ctx, "admin-go/api/v1/system/user/checkIsSuperAdmin", headerMap, &res); err != nil {
return
}
return
}