Files
22ee0aa112 修复安全问题 (#9)
* fix:修复权限问题

* fix:修复项目key类型错误问题

* fix:修复rbac权限问题

* fix:修复api密钥未及时失效的问题

* improve:优化渠道调度稳定性

* improve:优化路由

* fix:修复项目预算控制缺陷

* fix:加强限流等安全措施

* feat:添加限流相关字段的前端展示及接口字段

* improve:优化注册时密码要求,只需要字母和数字即可

* feat(setting):添加注册限流设置

* improve:优化前端数字类型转换

* chore:rbac权限放行

---------

Co-authored-by: chengqian <wuchengqian@kkidc.com>
Co-authored-by: qian <wuchengqian5@163.com>
2026-06-23 22:47:54 +08:00

63 lines
1.5 KiB
Go

package middleware
import (
"strings"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/qianfree/team-api/internal/consts"
"github.com/qianfree/team-api/internal/response"
)
var demoWhitelistPaths = map[string]bool{
"/api/admin/auth/login": true,
"/api/admin/auth/refresh": true,
"/api/admin/auth/logout": true,
"/api/admin/auth/2fa/verify": true,
"/api/tenant/auth/login": true,
"/api/tenant/auth/refresh": true,
"/api/tenant/auth/logout": true,
"/api/tenant/auth/register": true,
"/api/tenant/auth/2fa/verify": true,
}
// DemoMode blocks all write operations when demo mode is enabled.
// Controlled via config file: demo.enabled = true.
// Read-only requests (GET/HEAD/OPTIONS) and whitelisted paths are allowed.
func DemoMode(r *ghttp.Request) {
ctx := r.Context()
if !g.Cfg().MustGet(ctx, "demo.enabled").Bool() {
r.Middleware.Next()
return
}
method := r.Method
// Allow read-only requests
if method == "GET" || method == "HEAD" || method == "OPTIONS" {
r.Middleware.Next()
return
}
path := r.URL.Path
// Allow whitelisted paths
if demoWhitelistPaths[path] {
r.Middleware.Next()
return
}
// Allow captcha and setup endpoints
if strings.HasPrefix(path, "/api/captcha/") || strings.HasPrefix(path, "/api/setup/") {
r.Middleware.Next()
return
}
message := g.Cfg().MustGet(ctx, "demo.message").String()
if message == "" {
message = consts.MsgDemoModeRestricted
}
response.ErrorWithCode(r, 403, consts.CodeDemoModeRestricted, message)
}