修复工作人员资质关联与角色过滤
按安装、配送、运维菜单显式过滤工作人员,锁定资质所有者并使用姓名和角色回显。 扩展工作人员状态与多角色查询,补充权限校验、回归测试、操作日志和项目文档。
This commit is contained in:
@@ -149,9 +149,11 @@ func platformScopedRequestAllowed(ctx *gin.Context, menus []platformbase.Menu) b
|
||||
return hasMenuIdentity(menus, "staff_add")
|
||||
}
|
||||
if ctx.Request.Method == "GET" {
|
||||
required := staffMenuIdentity(ctx.Query("role_code"))
|
||||
return required != "" && (hasMenuIdentity(menus, required) ||
|
||||
(required == "staff_delivery" && hasMenuIdentity(menus, "gasorder_basic")))
|
||||
return staffListRolesAllowed(
|
||||
menus,
|
||||
ctx.Query("role_code"),
|
||||
ctx.Query("role_codes"),
|
||||
)
|
||||
}
|
||||
return false
|
||||
}
|
||||
@@ -217,6 +219,33 @@ func staffMenuIdentity(roleCode string) string {
|
||||
}
|
||||
}
|
||||
|
||||
// staffListRolesAllowed 要求查询中的每一种工作人员角色都具备对应菜单权限。
|
||||
func staffListRolesAllowed(menus []platformbase.Menu, roleCode, roleCodes string) bool {
|
||||
roleCode = strings.TrimSpace(roleCode)
|
||||
roleCodes = strings.TrimSpace(roleCodes)
|
||||
if (roleCode == "") == (roleCodes == "") {
|
||||
return false
|
||||
}
|
||||
requested := []string{roleCode}
|
||||
if roleCodes != "" {
|
||||
requested = strings.Split(roleCodes, ",")
|
||||
}
|
||||
seen := map[string]bool{}
|
||||
for _, role := range requested {
|
||||
role = strings.TrimSpace(role)
|
||||
required := staffMenuIdentity(role)
|
||||
if required == "" || seen[role] {
|
||||
return false
|
||||
}
|
||||
seen[role] = true
|
||||
if !hasMenuIdentity(menus, required) &&
|
||||
!(required == "staff_delivery" && hasMenuIdentity(menus, "gasorder_basic")) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func hasMenuIdentity(menus []platformbase.Menu, identity string) bool {
|
||||
for _, menu := range menus {
|
||||
if menu.Identity == identity {
|
||||
|
||||
@@ -76,3 +76,31 @@ func TestLocationScopeValuesAreExplicit(t *testing.T) {
|
||||
t.Fatal("ambiguous location scope was accepted")
|
||||
}
|
||||
}
|
||||
|
||||
func TestStaffListMultiRoleQueryRequiresEveryRoleMenu(t *testing.T) {
|
||||
allMenus := []platformbase.Menu{
|
||||
{Identity: "staff_installer"},
|
||||
{Identity: "staff_delivery"},
|
||||
{Identity: "staff_operations"},
|
||||
}
|
||||
if !staffListRolesAllowed(allMenus, "", "installer,delivery,operations") {
|
||||
t.Fatal("authorized multi-role staff query was rejected")
|
||||
}
|
||||
partialMenus := []platformbase.Menu{{Identity: "staff_installer"}}
|
||||
if staffListRolesAllowed(partialMenus, "", "installer,delivery,operations") {
|
||||
t.Fatal("partial staff permission granted a multi-role query")
|
||||
}
|
||||
if staffListRolesAllowed(allMenus, "delivery", "installer,delivery") {
|
||||
t.Fatal("ambiguous staff role filters were accepted")
|
||||
}
|
||||
}
|
||||
|
||||
func TestOrderMenuCanOnlyQueryDeliveryStaff(t *testing.T) {
|
||||
menus := []platformbase.Menu{{Identity: "gasorder_basic"}}
|
||||
if !staffListRolesAllowed(menus, "delivery", "") {
|
||||
t.Fatal("order management could not query delivery staff")
|
||||
}
|
||||
if staffListRolesAllowed(menus, "installer", "") {
|
||||
t.Fatal("order management could query installer staff")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user