80 lines
1.9 KiB
Go
80 lines
1.9 KiB
Go
package middlewares
|
|
|
|
import (
|
|
"quyun/v2/app/errorx"
|
|
"quyun/v2/app/services"
|
|
"quyun/v2/database/models"
|
|
"quyun/v2/pkg/consts"
|
|
"quyun/v2/providers/jwt"
|
|
|
|
"github.com/gofiber/fiber/v3"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
func (f *Middlewares) TenantResolve(c fiber.Ctx) error {
|
|
tenantCode := c.Params("tenant_code")
|
|
if tenantCode == "" {
|
|
return errorx.ErrMissingParameter.WithMsg("缺少 tenant_code")
|
|
}
|
|
|
|
tenantModel, err := services.Tenant.FindByCode(c, tenantCode)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
c.Locals(consts.CtxKeyTenant, tenantModel)
|
|
return c.Next()
|
|
}
|
|
|
|
func (f *Middlewares) TenantAuth(c fiber.Ctx) error {
|
|
authHeader := c.Get(jwt.HttpHeader)
|
|
if authHeader == "" {
|
|
return errorx.ErrTokenMissing
|
|
}
|
|
logrus.Infof("Token: %s", authHeader)
|
|
|
|
claims, err := f.jwt.Parse(authHeader)
|
|
if err != nil {
|
|
switch err {
|
|
case jwt.TokenExpired:
|
|
return errorx.ErrTokenExpired
|
|
case jwt.TokenMalformed, jwt.TokenNotValidYet, jwt.TokenInvalid:
|
|
return errorx.ErrTokenInvalid
|
|
default:
|
|
return errorx.ErrTokenInvalid
|
|
}
|
|
}
|
|
if claims.UserID == 0 {
|
|
return errorx.ErrTokenInvalid
|
|
}
|
|
|
|
c.Locals(consts.CtxKeyClaims, claims)
|
|
return c.Next()
|
|
}
|
|
|
|
func (f *Middlewares) TenantRequireMember(c fiber.Ctx) error {
|
|
tenantModel, ok := c.Locals(consts.CtxKeyTenant).(*models.Tenant)
|
|
if !ok || tenantModel == nil {
|
|
return errorx.ErrInternalError.WithMsg("tenant context missing")
|
|
}
|
|
|
|
claims, ok := c.Locals(consts.CtxKeyClaims).(*jwt.Claims)
|
|
if !ok || claims == nil {
|
|
return errorx.ErrInternalError.WithMsg("claims context missing")
|
|
}
|
|
|
|
tenantUser, err := services.Tenant.FindTenantUser(c, tenantModel.ID, claims.UserID)
|
|
if err != nil {
|
|
return errorx.ErrPermissionDenied.WithMsg("不属于该租户")
|
|
}
|
|
|
|
userModel, err := services.User.FindByID(c, claims.UserID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
c.Locals(consts.CtxKeyTenantUser, tenantUser)
|
|
c.Locals(consts.CtxKeyUser, userModel)
|
|
return c.Next()
|
|
}
|