|
|
@ -449,6 +449,44 @@ class DataScopeIntegrationTest { |
|
|
assertThat(resolver.visibleMenuTree(9L)).isEmpty(); |
|
|
assertThat(resolver.visibleMenuTree(9L)).isEmpty(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// ==================== perms→denyBehavior 下发(工单 auth-perms-01) ====================
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
@DisplayName("denyBehavior 映射:与权限码并集同源,多角色合并,停用权限点不出现") |
|
|
|
|
|
void denyBehaviors_multiRole_cutOffDisabled() { |
|
|
|
|
|
PermissionGrant grant = resolver.resolve(5L); // 角色1+2:授权 301,302,303,304
|
|
|
|
|
|
assertThat(grant.getDenyBehaviors()) |
|
|
|
|
|
.as("302 停用断路不进映射,303 是 menu 节点不进映射") |
|
|
|
|
|
.containsExactlyInAnyOrderEntriesOf(Map.of( |
|
|
|
|
|
"crm:user:list", "hide", |
|
|
|
|
|
"crm:order:list", "disable")); |
|
|
|
|
|
assertThat(grant.getDenyBehaviors().keySet()) |
|
|
|
|
|
.as("映射键与权限码并集完全一致") |
|
|
|
|
|
.containsExactlyInAnyOrderElementsOf(grant.getPermCodes()); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
@DisplayName("denyBehavior 未配置 -> 按 hide 兜底") |
|
|
|
|
|
void denyBehaviors_blank_defaultsToHide() { |
|
|
|
|
|
PermissionGrant grant = resolver.resolve(26L); // 角色6:仅授权 305(deny_behavior 未配置)
|
|
|
|
|
|
assertThat(grant.getPermCodes()).containsExactly("crm:order:export"); |
|
|
|
|
|
assertThat(grant.getDenyBehaviors()).containsEntry("crm:order:export", "hide"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
@DisplayName("同一 perms 多按钮冲突(hide vs disable)-> 取 disable,不依赖 DB 返回顺序") |
|
|
|
|
|
void denyBehaviors_samePermConflict_disableWins() { |
|
|
|
|
|
PermissionGrant grant = resolver.resolve(27L); // 角色7:同时授权 307(hide) 与 308(disable),同一 perms
|
|
|
|
|
|
assertThat(grant.getPermCodes()).containsExactly("crm:report:view"); |
|
|
|
|
|
assertThat(grant.getDenyBehaviors()).containsEntry("crm:report:view", "disable"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
@DisplayName("无角色用户:denyBehavior 映射为空") |
|
|
|
|
|
void denyBehaviors_noRole_emptyMap() { |
|
|
|
|
|
assertThat(resolver.resolve(9L).getDenyBehaviors()).isEmpty(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/** 建表 + 固定数据集(BaseEntity 审计列一律允许 NULL,deleted 显式置 0) */ |
|
|
/** 建表 + 固定数据集(BaseEntity 审计列一律允许 NULL,deleted 显式置 0) */ |
|
|
private static final String[] SCHEMA_AND_SEED = { |
|
|
private static final String[] SCHEMA_AND_SEED = { |
|
|
""" |
|
|
""" |
|
|
@ -532,12 +570,18 @@ class DataScopeIntegrationTest { |
|
|
"insert into sys_role (id, deleted, role_name, role_code) values (4, 0, '全部', 'ALL')", |
|
|
"insert into sys_role (id, deleted, role_name, role_code) values (4, 0, '全部', 'ALL')", |
|
|
// 角色5:roleCode 自带 ROLE_ 前缀(验证归一幂等,不得双前缀)
|
|
|
// 角色5:roleCode 自带 ROLE_ 前缀(验证归一幂等,不得双前缀)
|
|
|
"insert into sys_role (id, deleted, role_name, role_code) values (5, 0, '管理员', 'ROLE_ADMIN')", |
|
|
"insert into sys_role (id, deleted, role_name, role_code) values (5, 0, '管理员', 'ROLE_ADMIN')", |
|
|
|
|
|
// 角色6:仅授权 deny_behavior 未配置的按钮(验证 hide 兜底)
|
|
|
|
|
|
"insert into sys_role (id, deleted, role_name, role_code) values (6, 0, '兜底行为', 'BLANK_DENY')", |
|
|
|
|
|
// 角色7:同时授权同一 perms 的 hide/disable 两按钮(验证冲突取 disable)
|
|
|
|
|
|
"insert into sys_role (id, deleted, role_name, role_code) values (7, 0, '冲突裁决', 'DENY_CONFLICT')", |
|
|
// 角色×模块档位:角色 id 即档位值
|
|
|
// 角色×模块档位:角色 id 即档位值
|
|
|
"insert into sys_role_data_scope (id, role_id, module_code, data_scope) values (1, 1, 'test', 1)", |
|
|
"insert into sys_role_data_scope (id, role_id, module_code, data_scope) values (1, 1, 'test', 1)", |
|
|
"insert into sys_role_data_scope (id, role_id, module_code, data_scope) values (2, 2, 'test', 2)", |
|
|
"insert into sys_role_data_scope (id, role_id, module_code, data_scope) values (2, 2, 'test', 2)", |
|
|
"insert into sys_role_data_scope (id, role_id, module_code, data_scope) values (3, 3, 'test', 3)", |
|
|
"insert into sys_role_data_scope (id, role_id, module_code, data_scope) values (3, 3, 'test', 3)", |
|
|
"insert into sys_role_data_scope (id, role_id, module_code, data_scope) values (4, 4, 'test', 4)", |
|
|
"insert into sys_role_data_scope (id, role_id, module_code, data_scope) values (4, 4, 'test', 4)", |
|
|
"insert into sys_role_data_scope (id, role_id, module_code, data_scope) values (5, 5, 'test', 1)", |
|
|
"insert into sys_role_data_scope (id, role_id, module_code, data_scope) values (5, 5, 'test', 1)", |
|
|
|
|
|
"insert into sys_role_data_scope (id, role_id, module_code, data_scope) values (6, 6, 'test', 1)", |
|
|
|
|
|
"insert into sys_role_data_scope (id, role_id, module_code, data_scope) values (7, 7, 'test', 1)", |
|
|
// 用户
|
|
|
// 用户
|
|
|
"insert into crm_auth_user (id, deleted, username, dept_id) values (1, 0, '仅本人-销售部', 10)", |
|
|
"insert into crm_auth_user (id, deleted, username, dept_id) values (1, 0, '仅本人-销售部', 10)", |
|
|
"insert into crm_auth_user (id, deleted, username, dept_id) values (2, 0, '本部门-销售部', 10)", |
|
|
"insert into crm_auth_user (id, deleted, username, dept_id) values (2, 0, '本部门-销售部', 10)", |
|
|
@ -552,6 +596,8 @@ class DataScopeIntegrationTest { |
|
|
"insert into crm_auth_user (id, deleted, username, dept_id) values (23, 0, '兼职-无主部门', null)", |
|
|
"insert into crm_auth_user (id, deleted, username, dept_id) values (23, 0, '兼职-无主部门', null)", |
|
|
"insert into crm_auth_user (id, deleted, username, dept_id) values (24, 0, '兼职-层级重叠', 10)", |
|
|
"insert into crm_auth_user (id, deleted, username, dept_id) values (24, 0, '兼职-层级重叠', 10)", |
|
|
"insert into crm_auth_user (id, deleted, username, dept_id) values (25, 0, '带前缀角色', 10)", |
|
|
"insert into crm_auth_user (id, deleted, username, dept_id) values (25, 0, '带前缀角色', 10)", |
|
|
|
|
|
"insert into crm_auth_user (id, deleted, username, dept_id) values (26, 0, '兜底行为测试', 10)", |
|
|
|
|
|
"insert into crm_auth_user (id, deleted, username, dept_id) values (27, 0, '冲突裁决测试', 10)", |
|
|
// 用户-角色
|
|
|
// 用户-角色
|
|
|
"insert into sys_user_role (id, user_id, role_id) values (1001, 1, 1)", |
|
|
"insert into sys_user_role (id, user_id, role_id) values (1001, 1, 1)", |
|
|
"insert into sys_user_role (id, user_id, role_id) values (1002, 2, 2)", |
|
|
"insert into sys_user_role (id, user_id, role_id) values (1002, 2, 2)", |
|
|
@ -566,6 +612,8 @@ class DataScopeIntegrationTest { |
|
|
"insert into sys_user_role (id, user_id, role_id) values (1011, 23, 2)", |
|
|
"insert into sys_user_role (id, user_id, role_id) values (1011, 23, 2)", |
|
|
"insert into sys_user_role (id, user_id, role_id) values (1012, 24, 3)", |
|
|
"insert into sys_user_role (id, user_id, role_id) values (1012, 24, 3)", |
|
|
"insert into sys_user_role (id, user_id, role_id) values (1013, 25, 5)", |
|
|
"insert into sys_user_role (id, user_id, role_id) values (1013, 25, 5)", |
|
|
|
|
|
"insert into sys_user_role (id, user_id, role_id) values (1014, 26, 6)", |
|
|
|
|
|
"insert into sys_user_role (id, user_id, role_id) values (1015, 27, 7)", |
|
|
// 兼职挂靠
|
|
|
// 兼职挂靠
|
|
|
"insert into sys_user_dept (id, user_id, dept_id) values (2001, 21, 20)", |
|
|
"insert into sys_user_dept (id, user_id, dept_id) values (2001, 21, 20)", |
|
|
"insert into sys_user_dept (id, user_id, dept_id) values (2002, 22, 12)", |
|
|
"insert into sys_user_dept (id, user_id, dept_id) values (2002, 22, 12)", |
|
|
@ -578,16 +626,22 @@ class DataScopeIntegrationTest { |
|
|
"insert into test_owned_data (id, deleted, dept_id, owner_id, title) values (104, 0, 20, 4, '市场部-用户4')", |
|
|
"insert into test_owned_data (id, deleted, dept_id, owner_id, title) values (104, 0, 20, 4, '市场部-用户4')", |
|
|
"insert into test_owned_data (id, deleted, dept_id, owner_id, title) values (105, 0, 20, 1, '市场部-用户1')", |
|
|
"insert into test_owned_data (id, deleted, dept_id, owner_id, title) values (105, 0, 20, 1, '市场部-用户1')", |
|
|
"insert into test_owned_data (id, deleted, dept_id, owner_id, title) values (106, 0, 121, 8, '华北一队-用户8')", |
|
|
"insert into test_owned_data (id, deleted, dept_id, owner_id, title) values (106, 0, 121, 8, '华北一队-用户8')", |
|
|
// 权限资源树:302 是停用权限点(全局断路);303 是 menu 节点(不进权限码并集)
|
|
|
// 权限资源树:302 是停用权限点(全局断路);303 是 menu 节点(不进权限码并集);305 deny_behavior 未配置(hide 兜底)
|
|
|
"insert into sys_menu (id, deleted, parent_id, menu_name, menu_type, perms, status, visible, sort) values (301, 0, 0, '用户列表按钮', 3, 'crm:user:list', 'enabled', 1, 0)", |
|
|
"insert into sys_menu (id, deleted, parent_id, menu_name, menu_type, perms, deny_behavior, status, visible, sort) values (301, 0, 0, '用户列表按钮', 3, 'crm:user:list', 'hide', 'enabled', 1, 0)", |
|
|
"insert into sys_menu (id, deleted, parent_id, menu_name, menu_type, perms, status, visible, sort) values (302, 0, 0, '用户删除按钮', 3, 'crm:user:delete', 'disabled', 1, 0)", |
|
|
"insert into sys_menu (id, deleted, parent_id, menu_name, menu_type, perms, deny_behavior, status, visible, sort) values (302, 0, 0, '用户删除按钮', 3, 'crm:user:delete', 'disable', 'disabled', 1, 0)", |
|
|
"insert into sys_menu (id, deleted, parent_id, menu_name, menu_type, path, visible, sort) values (303, 0, 0, '订单菜单', 2, '/order', 1, 0)", |
|
|
"insert into sys_menu (id, deleted, parent_id, menu_name, menu_type, path, visible, sort) values (303, 0, 0, '订单菜单', 2, '/order', 1, 0)", |
|
|
"insert into sys_menu (id, deleted, parent_id, menu_name, menu_type, perms, status, visible, sort) values (304, 0, 303, '订单列表按钮', 3, 'crm:order:list', 'enabled', 1, 0)", |
|
|
"insert into sys_menu (id, deleted, parent_id, menu_name, menu_type, perms, deny_behavior, status, visible, sort) values (304, 0, 303, '订单列表按钮', 3, 'crm:order:list', 'disable', 'enabled', 1, 0)", |
|
|
// 角色授权:角色1→301,302;角色2→302,304,303
|
|
|
"insert into sys_menu (id, deleted, parent_id, menu_name, menu_type, perms, status, visible, sort) values (305, 0, 303, '订单导出按钮', 3, 'crm:order:export', 'enabled', 1, 0)", |
|
|
|
|
|
"insert into sys_menu (id, deleted, parent_id, menu_name, menu_type, perms, deny_behavior, status, visible, sort) values (307, 0, 303, '报表查看按钮-hide', 3, 'crm:report:view', 'hide', 'enabled', 1, 0)", |
|
|
|
|
|
"insert into sys_menu (id, deleted, parent_id, menu_name, menu_type, perms, deny_behavior, status, visible, sort) values (308, 0, 303, '报表查看按钮-disable', 3, 'crm:report:view', 'disable', 'enabled', 1, 0)", |
|
|
|
|
|
// 角色授权:角色1→301,302;角色2→302,304,303;角色6→305(deny_behavior 未配置);角色7→307,308(同 perms 冲突)
|
|
|
"insert into sys_role_menu (id, role_id, menu_id) values (5001, 1, 301)", |
|
|
"insert into sys_role_menu (id, role_id, menu_id) values (5001, 1, 301)", |
|
|
"insert into sys_role_menu (id, role_id, menu_id) values (5002, 1, 302)", |
|
|
"insert into sys_role_menu (id, role_id, menu_id) values (5002, 1, 302)", |
|
|
"insert into sys_role_menu (id, role_id, menu_id) values (5003, 2, 302)", |
|
|
"insert into sys_role_menu (id, role_id, menu_id) values (5003, 2, 302)", |
|
|
"insert into sys_role_menu (id, role_id, menu_id) values (5004, 2, 304)", |
|
|
"insert into sys_role_menu (id, role_id, menu_id) values (5004, 2, 304)", |
|
|
"insert into sys_role_menu (id, role_id, menu_id) values (5005, 2, 303)", |
|
|
"insert into sys_role_menu (id, role_id, menu_id) values (5005, 2, 303)", |
|
|
|
|
|
"insert into sys_role_menu (id, role_id, menu_id) values (5006, 6, 305)", |
|
|
|
|
|
"insert into sys_role_menu (id, role_id, menu_id) values (5008, 7, 307)", |
|
|
|
|
|
"insert into sys_role_menu (id, role_id, menu_id) values (5009, 7, 308)", |
|
|
}; |
|
|
}; |
|
|
} |
|
|
} |
|
|
|