118 lines
3.3 KiB
Go
118 lines
3.3 KiB
Go
package authx
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// CompanyPermCatalog 公司可被授予的权限模块(不含平台专属「管理租户」)。
|
|
func CompanyPermCatalog() []string {
|
|
return []string{
|
|
Perm读取模块, Perm写入模块, Perm发布模块,
|
|
Perm查询数据, Perm新增数据, Perm更新数据, Perm删除数据, Perm导入数据, Perm导出数据,
|
|
Perm下载文件, Perm上传文件,
|
|
Perm查看审计,
|
|
Perm管理智能体, Perm邀请成员, Perm管理组织,
|
|
Perm数据同步,
|
|
}
|
|
}
|
|
|
|
// PermModule 权限模块分组。
|
|
type PermModule struct {
|
|
Title string `json:"title"`
|
|
Items []PermItem `json:"items"`
|
|
}
|
|
|
|
type PermItem struct {
|
|
Perm string `json:"perm"`
|
|
Desc string `json:"desc"`
|
|
}
|
|
|
|
// PermDesc 权限说明(超管授权 / 公司分配时展示)。
|
|
func PermDesc(p string) string {
|
|
switch NormalizePerm(p) {
|
|
case Perm读取模块:
|
|
return "查看模块列表、蓝图与智能体胶囊"
|
|
case Perm写入模块:
|
|
return "保存在建草稿(不发布)"
|
|
case Perm发布模块:
|
|
return "发布/更新线上模块"
|
|
case Perm查询数据:
|
|
return "查询业务列表与详情"
|
|
case Perm新增数据:
|
|
return "新增业务数据行"
|
|
case Perm更新数据:
|
|
return "更新业务数据行"
|
|
case Perm删除数据:
|
|
return "删除业务数据行"
|
|
case Perm导入数据:
|
|
return "导入 Excel/CSV/JSON"
|
|
case Perm导出数据:
|
|
return "导出业务数据"
|
|
case Perm下载文件:
|
|
return "下载已上传文件"
|
|
case Perm上传文件:
|
|
return "上传附件与素材"
|
|
case Perm查看审计:
|
|
return "查看操作审计日志"
|
|
case Perm管理智能体:
|
|
return "管理智能体账号与角色权限"
|
|
case Perm邀请成员:
|
|
return "生成邀请码、管理成员角色"
|
|
case Perm管理组织:
|
|
return "管理组织单元与成员归属"
|
|
case Perm数据同步:
|
|
return "配置跨库数据同步通道"
|
|
case Perm管理租户:
|
|
return "平台级:管理公司与权限额度"
|
|
default:
|
|
return p
|
|
}
|
|
}
|
|
|
|
func PermModules() []PermModule {
|
|
mk := func(title string, perms ...string) PermModule {
|
|
items := make([]PermItem, 0, len(perms))
|
|
for _, p := range perms {
|
|
items = append(items, PermItem{Perm: p, Desc: PermDesc(p)})
|
|
}
|
|
return PermModule{Title: title, Items: items}
|
|
}
|
|
return []PermModule{
|
|
mk("模块", Perm读取模块, Perm写入模块, Perm发布模块),
|
|
mk("数据", Perm查询数据, Perm新增数据, Perm更新数据, Perm删除数据, Perm导入数据, Perm导出数据),
|
|
mk("文件", Perm下载文件, Perm上传文件),
|
|
mk("审计", Perm查看审计),
|
|
mk("公司管理", Perm管理智能体, Perm邀请成员, Perm管理组织),
|
|
mk("数据同步", Perm数据同步),
|
|
}
|
|
}
|
|
|
|
// FilterWithinAllowance 只保留额度内的权限。
|
|
func FilterWithinAllowance(want, allowance []string) ([]string, []string) {
|
|
allow := map[string]struct{}{}
|
|
for _, p := range NormalizePerms(allowance) {
|
|
allow[p] = struct{}{}
|
|
}
|
|
var ok, denied []string
|
|
for _, p := range NormalizePerms(want) {
|
|
if _, hit := allow[p]; hit {
|
|
ok = append(ok, p)
|
|
} else {
|
|
denied = append(denied, p)
|
|
}
|
|
}
|
|
return ok, denied
|
|
}
|
|
|
|
var EntitlementChecker func(ctx context.Context, tenantID int64, perm string) bool
|
|
|
|
func AssertWithinEntitlement(want, allowance []string) error {
|
|
_, denied := FilterWithinAllowance(want, allowance)
|
|
if len(denied) == 0 {
|
|
return nil
|
|
}
|
|
return fmt.Errorf("超出公司权限额度: %s", strings.Join(denied, "、"))
|
|
}
|