|
|
|
|
# 认证服务模块(crm-auth)
|
|
|
|
|
|
|
|
|
|
<cite>
|
|
|
|
|
**本文引用的文件**
|
|
|
|
|
- [AuthApplication.java](file://crm-auth/src/main/java/com/crm/auth/AuthApplication.java)
|
|
|
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
|
|
|
|
- [PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java)
|
|
|
|
|
- [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java)
|
|
|
|
|
- [DataInitializer.java](file://crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java)
|
|
|
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
|
|
|
|
- [SystemController.java](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java)
|
|
|
|
|
- [RoleController.java](file://crm-auth/src/main/java/com/crm/auth/controller/RoleController.java)
|
|
|
|
|
- [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java)
|
|
|
|
|
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
|
|
|
|
|
- [AuthLoginUser.java](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java)
|
|
|
|
|
- [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java)
|
|
|
|
|
- [DataScopeTables.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeTables.java)
|
|
|
|
|
- [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java)
|
|
|
|
|
- [IAuthService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthService.java)
|
|
|
|
|
- [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java)
|
|
|
|
|
- [IAuthUserService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthUserService.java)
|
|
|
|
|
- [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java)
|
|
|
|
|
- [IAuthIdentityService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthIdentityService.java)
|
|
|
|
|
- [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java)
|
|
|
|
|
- [ISysRoleService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysRoleService.java)
|
|
|
|
|
- [SysRoleServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysRoleServiceImpl.java)
|
|
|
|
|
- [ISysMenuService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysMenuService.java)
|
|
|
|
|
- [SysMenuServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysMenuServiceImpl.java)
|
|
|
|
|
- [ISysDeptService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysDeptService.java)
|
|
|
|
|
- [SysDeptServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysDeptServiceImpl.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [IResourceService.java](file://crm-auth/src/main/java/com/crm/auth/service/IResourceService.java)
|
|
|
|
|
- [ResourceServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java)
|
|
|
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
|
|
|
|
|
- [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java)
|
|
|
|
|
- [ThirdPartyUserInfo.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyUserInfo.java)
|
|
|
|
|
- [LoginParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/LoginParam.java)
|
|
|
|
|
- [UserPageParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/UserPageParam.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [ResourceNode.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java)
|
|
|
|
|
- [RoleDetailVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/RoleDetailVO.java)
|
|
|
|
|
- [LoginResultDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/LoginResultDTO.java)
|
|
|
|
|
- [UserInfoDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserInfoDTO.java)
|
|
|
|
|
- [UserListDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserListDTO.java)
|
|
|
|
|
- [UserStatsVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserStatsVO.java)
|
|
|
|
|
- [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java)
|
|
|
|
|
- [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java)
|
|
|
|
|
- [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java)
|
|
|
|
|
- [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java)
|
|
|
|
|
- [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java)
|
|
|
|
|
- [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java)
|
|
|
|
|
- [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java)
|
|
|
|
|
- [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java)
|
|
|
|
|
- [DataScopeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/DataScopeEnum.java)
|
|
|
|
|
- [IdentityTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/IdentityTypeEnum.java)
|
|
|
|
|
- [MenuTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/MenuTypeEnum.java)
|
|
|
|
|
- [AuthConstants.java](file://crm-auth/src/main/java/com/crm/auth/constant/AuthConstants.java)
|
|
|
|
|
- [SysRoleMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysRoleMapper.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [FileApi.java](file://crm-file/src/main/java/com/crm/file/api/FileApi.java)
|
|
|
|
|
- [application.yml](file://crm-auth/src/main/resources/application.yml)
|
|
|
|
|
</cite>
|
|
|
|
|
|
|
|
|
|
## 更新摘要
|
|
|
|
|
**变更内容**
|
|
|
|
|
- 新增完整的角色管理系统,包含RoleController控制器、SysRoleServiceImpl服务实现和RoleDetailVO数据传输对象
|
|
|
|
|
- 实现了角色的CRUD操作,包括分页查询、保存编辑、详情获取、权限分配和级联删除
|
|
|
|
|
- 增强了角色数据完整性校验,包括角色编码唯一性、内置角色保护、数据范围验证等
|
|
|
|
|
- 新增了角色权限资源分配功能,支持祖先节点自动补全和全量替换机制
|
|
|
|
|
- 完善了角色管理相关的错误码定义和异常处理机制
|
|
|
|
|
|
|
|
|
|
## 目录
|
|
|
|
|
1. [简介](#简介)
|
|
|
|
|
2. [项目结构](#项目结构)
|
|
|
|
|
3. [核心组件](#核心组件)
|
|
|
|
|
4. [架构总览](#架构总览)
|
|
|
|
|
5. [详细组件分析](#详细组件分析)
|
|
|
|
|
6. [依赖关系分析](#依赖关系分析)
|
|
|
|
|
7. [性能考虑](#性能考虑)
|
|
|
|
|
8. [故障排查指南](#故障排查指南)
|
|
|
|
|
9. [结论](#结论)
|
|
|
|
|
10. [附录](#附录)
|
|
|
|
|
|
|
|
|
|
## 简介
|
|
|
|
|
本模块为 CRM 后端的认证与授权中心,提供用户登录、JWT 令牌签发与校验、角色权限控制、数据权限(部门/范围)过滤、第三方登录集成(如钉钉)等能力。通过安全配置、过滤器链与拦截器协同工作,实现从请求入口到业务方法的全链路鉴权与数据可见性控制。**最新更新引入了完整的角色管理系统,提供了专业的角色CRUD操作、权限资源分配、数据完整性校验和企业级安全特性,显著提升了权限管理的灵活性和安全性。**
|
|
|
|
|
|
|
|
|
|
## 项目结构
|
|
|
|
|
认证模块采用分层架构:
|
|
|
|
|
- 配置层:安全策略、权限开关、第三方登录参数、初始化数据等
|
|
|
|
|
- 控制器层:登录、登出、用户信息、系统信息、**角色管理**、资源管理等接口
|
|
|
|
|
- 安全层:JWT 过滤器、令牌服务、登录用户上下文、异常处理、数据权限拦截器
|
|
|
|
|
- 服务层:认证、用户、身份、**角色**、菜单、部门、**资源管理**等业务逻辑
|
|
|
|
|
- 领域模型:实体、枚举、DTO、入参
|
|
|
|
|
- 客户端:第三方登录客户端及工厂
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
graph TB
|
|
|
|
|
subgraph "配置"
|
|
|
|
|
SC["SecurityConfig"]
|
|
|
|
|
PC["PermissionConfig"]
|
|
|
|
|
AP["AuthProperties"]
|
|
|
|
|
DI["DataInitializer"]
|
|
|
|
|
end
|
|
|
|
|
subgraph "控制器"
|
|
|
|
|
AC["AuthController"]
|
|
|
|
|
SYSC["SystemController"]
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
RC["ResourceController"]
|
|
|
|
|
RLC["RoleController"]
|
|
|
|
|
end
|
|
|
|
|
subgraph "安全"
|
|
|
|
|
JF["JwtAuthenticationFilter"]
|
|
|
|
|
TS["TokenService"]
|
|
|
|
|
ALU["AuthLoginUser"]
|
|
|
|
|
DSI["DataScopeInterceptor"]
|
|
|
|
|
SEH["SecurityExceptionHandlers"]
|
|
|
|
|
end
|
|
|
|
|
subgraph "服务"
|
|
|
|
|
IAS["IAuthService"]
|
|
|
|
|
AS["AuthServiceImpl"]
|
|
|
|
|
IAUS["IAuthUserService"]
|
|
|
|
|
AUS["AuthUserServiceImpl"]
|
|
|
|
|
IIDS["IAuthIdentityService"]
|
|
|
|
|
AIS["AuthIdentityServiceImpl"]
|
|
|
|
|
IRS["ISysRoleService"]
|
|
|
|
|
SRS["SysRoleServiceImpl"]
|
|
|
|
|
IMS["ISysMenuService"]
|
|
|
|
|
SMS["SysMenuServiceImpl"]
|
|
|
|
|
IDS["ISysDeptService"]
|
|
|
|
|
SDS["SysDeptServiceImpl"]
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
IRSVC["IResourceService"]
|
|
|
|
|
RSVC["ResourceServiceImpl"]
|
|
|
|
|
end
|
|
|
|
|
subgraph "第三方"
|
|
|
|
|
DTAC["DingTalkAuthClient"]
|
|
|
|
|
TPACF["ThirdPartyAuthClientFactory"]
|
|
|
|
|
TPI["ThirdPartyUserInfo"]
|
|
|
|
|
end
|
|
|
|
|
subgraph "领域模型"
|
|
|
|
|
LPM["LoginParam"]
|
|
|
|
|
UPM["UserPageParam"]
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
RN["ResourceNode"]
|
|
|
|
|
RDV["RoleDetailVO"]
|
|
|
|
|
LRDTO["LoginResultDTO"]
|
|
|
|
|
UIDTO["UserInfoDTO"]
|
|
|
|
|
ULDTO["UserListDTO"]
|
|
|
|
|
USVO["UserStatsVO"]
|
|
|
|
|
AU["AuthUser"]
|
|
|
|
|
AI["AuthIdentity"]
|
|
|
|
|
SR["SysRole"]
|
|
|
|
|
SM["SysMenu"]
|
|
|
|
|
SD["SysDept"]
|
|
|
|
|
SUR["SysUserRole"]
|
|
|
|
|
SRM["SysRoleMenu"]
|
|
|
|
|
SUD["SysUserDept"]
|
|
|
|
|
end
|
|
|
|
|
AC --> IAS
|
|
|
|
|
AC --> IAUS
|
|
|
|
|
AC --> IIDS
|
|
|
|
|
SYSC --> IMS
|
|
|
|
|
SYSC --> IRS
|
|
|
|
|
SYSC --> IDS
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
RC --> IRSVC
|
|
|
|
|
RLC --> IRS
|
|
|
|
|
JF --> TS
|
|
|
|
|
JF --> ALU
|
|
|
|
|
DSI --> ALU
|
|
|
|
|
AS --> IAUS
|
|
|
|
|
AS --> IIDS
|
|
|
|
|
AS --> IRS
|
|
|
|
|
AS --> IMS
|
|
|
|
|
AS --> IDS
|
|
|
|
|
AUS --> IIDS
|
|
|
|
|
AIS --> IAUS
|
|
|
|
|
SRS --> IRS
|
|
|
|
|
SMS --> IMS
|
|
|
|
|
SDS --> IDS
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
RSVC --> IMS
|
|
|
|
|
RSVC --> FileApi["FileApi"]
|
|
|
|
|
DTAC --> TPACF
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
图表来源
|
|
|
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
|
|
|
|
- [PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java)
|
|
|
|
|
- [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java)
|
|
|
|
|
- [DataInitializer.java](file://crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java)
|
|
|
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
|
|
|
|
- [SystemController.java](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java)
|
|
|
|
|
- [RoleController.java](file://crm-auth/src/main/java/com/crm/auth/controller/RoleController.java)
|
|
|
|
|
- [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java)
|
|
|
|
|
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
|
|
|
|
|
- [AuthLoginUser.java](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java)
|
|
|
|
|
- [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java)
|
|
|
|
|
- [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java)
|
|
|
|
|
- [IAuthService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthService.java)
|
|
|
|
|
- [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java)
|
|
|
|
|
- [IAuthUserService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthUserService.java)
|
|
|
|
|
- [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java)
|
|
|
|
|
- [IAuthIdentityService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthIdentityService.java)
|
|
|
|
|
- [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java)
|
|
|
|
|
- [ISysRoleService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysRoleService.java)
|
|
|
|
|
- [SysRoleServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysRoleServiceImpl.java)
|
|
|
|
|
- [ISysMenuService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysMenuService.java)
|
|
|
|
|
- [SysMenuServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysMenuServiceImpl.java)
|
|
|
|
|
- [ISysDeptService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysDeptService.java)
|
|
|
|
|
- [SysDeptServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysDeptServiceImpl.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [IResourceService.java](file://crm-auth/src/main/java/com/crm/auth/service/IResourceService.java)
|
|
|
|
|
- [ResourceServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java)
|
|
|
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
|
|
|
|
|
- [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java)
|
|
|
|
|
- [ThirdPartyUserInfo.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyUserInfo.java)
|
|
|
|
|
- [LoginParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/LoginParam.java)
|
|
|
|
|
- [UserPageParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/UserPageParam.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [ResourceNode.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java)
|
|
|
|
|
- [RoleDetailVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/RoleDetailVO.java)
|
|
|
|
|
- [LoginResultDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/LoginResultDTO.java)
|
|
|
|
|
- [UserInfoDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserInfoDTO.java)
|
|
|
|
|
- [UserListDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserListDTO.java)
|
|
|
|
|
- [UserStatsVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserStatsVO.java)
|
|
|
|
|
- [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java)
|
|
|
|
|
- [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java)
|
|
|
|
|
- [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java)
|
|
|
|
|
- [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java)
|
|
|
|
|
- [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java)
|
|
|
|
|
- [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java)
|
|
|
|
|
- [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java)
|
|
|
|
|
- [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java)
|
|
|
|
|
|
|
|
|
|
章节来源
|
|
|
|
|
- [AuthApplication.java](file://crm-auth/src/main/java/com/crm/auth/AuthApplication.java)
|
|
|
|
|
- [application.yml](file://crm-auth/src/main/resources/application.yml)
|
|
|
|
|
|
|
|
|
|
## 核心组件
|
|
|
|
|
- 安全配置与安全过滤器
|
|
|
|
|
- SecurityConfig:定义全局安全策略、放行路径、跨域、会话策略、异常处理器注册等
|
|
|
|
|
- JwtAuthenticationFilter:解析请求头中的 JWT,构建并设置认证上下文
|
|
|
|
|
- TokenService:JWT 的签发、解析、刷新、黑名单/过期管理(如有)
|
|
|
|
|
- AuthLoginUser:封装当前登录用户及其角色、权限、数据权限范围
|
|
|
|
|
- DataScopeInterceptor:在业务查询前注入数据权限 SQL 片段,限制数据可见范围
|
|
|
|
|
- SecurityExceptionHandlers:统一安全相关异常处理与响应
|
|
|
|
|
|
|
|
|
|
- 认证与授权服务
|
|
|
|
|
- IAuthService/AuthServiceImpl:登录、登出、密码校验、第三方登录流程编排,**新增事务外组织准入预校验**
|
|
|
|
|
- IAuthUserService/AuthUserServiceImpl:用户信息查询、状态校验、缓存(可选)、用户列表分页查询
|
|
|
|
|
- IAuthIdentityService/AuthIdentityServiceImpl:多身份源绑定与校验(手机号、邮箱、第三方)
|
|
|
|
|
- **ISysRoleService/SysRoleServiceImpl:角色管理核心服务,提供完整的CRUD操作、权限分配和数据完整性校验**
|
|
|
|
|
- ISysMenuService/SysMenuServiceImpl:菜单树、按钮级权限标识
|
|
|
|
|
- ISysDeptService/SysDeptServiceImpl:部门树、用户-部门关联
|
|
|
|
|
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- **统一权限资源管理服务**
|
|
|
|
|
- IResourceService:资源树管理接口,提供全量查询、新增编辑、删除、图标上传等功能
|
|
|
|
|
- ResourceServiceImpl:资源树服务实现,包含复杂的验证逻辑、层级约束检查和文件上传集成
|
|
|
|
|
- ResourceNode:资源节点数据传输对象,支持catalog/menu/button三种类型
|
|
|
|
|
|
|
|
|
|
- **角色管理增强组件**
|
|
|
|
|
- RoleController:角色管理REST API端点,提供分页查询、保存编辑、详情获取、权限分配、删除等操作
|
|
|
|
|
- SysRoleServiceImpl:角色服务实现,包含完整的数据校验、内置角色保护、祖先节点补全等逻辑
|
|
|
|
|
- RoleDetailVO:角色详情数据传输对象,包含基本信息和已授权的完整资源集合
|
|
|
|
|
|
|
|
|
|
- 第三方登录与企业级安全
|
|
|
|
|
- ThirdPartyAuthClient:第三方登录抽象接口,**新增组织成员验证方法**
|
|
|
|
|
- DingTalkAuthClient:钉钉登录实现,**新增企业级token管理和组织准入校验**
|
|
|
|
|
- ThirdPartyAuthClientFactory:按类型创建对应第三方客户端
|
|
|
|
|
- ThirdPartyUserInfo:第三方返回的用户信息标准化
|
|
|
|
|
|
|
|
|
|
- 用户管理增强组件
|
|
|
|
|
- UserPageParam:用户列表分页查询参数,支持多维度筛选条件
|
|
|
|
|
- UserListDTO:用户列表数据传输对象,包含用户基本信息和关联信息
|
|
|
|
|
- UserStatsVO:用户统计视图对象,提供用户数量、状态分布等统计信息
|
|
|
|
|
|
|
|
|
|
- 领域模型与常量
|
|
|
|
|
- LoginParam/LoginResultDTO/UserInfoDTO:登录入参与结果
|
|
|
|
|
- UserPageParam/UserListDTO/UserStatsVO:用户列表分页查询和统计相关DTO
|
|
|
|
|
- AuthUser/AuthIdentity/**SysRole**/SysMenu/SysDept 等实体
|
|
|
|
|
- DataScopeEnum/IdentityTypeEnum/MenuTypeEnum:数据权限、身份类型、菜单类型
|
|
|
|
|
- AuthConstants:认证相关常量,**新增角色管理相关错误码**
|
|
|
|
|
|
|
|
|
|
章节来源
|
|
|
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
|
|
|
|
- [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java)
|
|
|
|
|
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
|
|
|
|
|
- [AuthLoginUser.java](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java)
|
|
|
|
|
- [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java)
|
|
|
|
|
- [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java)
|
|
|
|
|
- [IAuthService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthService.java)
|
|
|
|
|
- [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java)
|
|
|
|
|
- [IAuthUserService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthUserService.java)
|
|
|
|
|
- [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java)
|
|
|
|
|
- [IAuthIdentityService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthIdentityService.java)
|
|
|
|
|
- [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java)
|
|
|
|
|
- [ISysRoleService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysRoleService.java)
|
|
|
|
|
- [SysRoleServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysRoleServiceImpl.java)
|
|
|
|
|
- [ISysMenuService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysMenuService.java)
|
|
|
|
|
- [SysMenuServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysMenuServiceImpl.java)
|
|
|
|
|
- [ISysDeptService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysDeptService.java)
|
|
|
|
|
- [SysDeptServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysDeptServiceImpl.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [IResourceService.java](file://crm-auth/src/main/java/com/crm/auth/service/IResourceService.java)
|
|
|
|
|
- [ResourceServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java)
|
|
|
|
|
- [ResourceNode.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java)
|
|
|
|
|
- [RoleDetailVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/RoleDetailVO.java)
|
|
|
|
|
- [RoleController.java](file://crm-auth/src/main/java/com/crm/auth/controller/RoleController.java)
|
|
|
|
|
- [ThirdPartyAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClient.java)
|
|
|
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
|
|
|
|
|
- [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java)
|
|
|
|
|
- [ThirdPartyUserInfo.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyUserInfo.java)
|
|
|
|
|
- [LoginParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/LoginParam.java)
|
|
|
|
|
- [UserPageParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/UserPageParam.java)
|
|
|
|
|
- [LoginResultDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/LoginResultDTO.java)
|
|
|
|
|
- [UserInfoDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserInfoDTO.java)
|
|
|
|
|
- [UserListDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserListDTO.java)
|
|
|
|
|
- [UserStatsVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserStatsVO.java)
|
|
|
|
|
- [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java)
|
|
|
|
|
- [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java)
|
|
|
|
|
- [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java)
|
|
|
|
|
- [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java)
|
|
|
|
|
- [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java)
|
|
|
|
|
- [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java)
|
|
|
|
|
- [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java)
|
|
|
|
|
- [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java)
|
|
|
|
|
- [DataScopeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/DataScopeEnum.java)
|
|
|
|
|
- [IdentityTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/IdentityTypeEnum.java)
|
|
|
|
|
- [MenuTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/MenuTypeEnum.java)
|
|
|
|
|
- [AuthConstants.java](file://crm-auth/src/main/java/com/crm/auth/constant/AuthConstants.java)
|
|
|
|
|
|
|
|
|
|
## 架构总览
|
|
|
|
|
认证服务以"控制器 -> 服务 -> 安全上下文"为主线,配合 JWT 过滤器与数据权限拦截器完成全链路鉴权。**最新更新引入了完整的角色管理系统,通过RoleController提供REST API接口,SysRoleServiceImpl实现复杂的业务验证逻辑,形成了完善的基于角色的访问控制(RBAC)体系。**
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
sequenceDiagram
|
|
|
|
|
participant C as "客户端"
|
|
|
|
|
participant AC as "AuthController"
|
|
|
|
|
participant RLC as "RoleController"
|
|
|
|
|
participant AS as "AuthServiceImpl"
|
|
|
|
|
participant SRS as "SysRoleServiceImpl"
|
|
|
|
|
participant AUS as "AuthUserServiceImpl"
|
|
|
|
|
participant AIS as "AuthIdentityServiceImpl"
|
|
|
|
|
participant DTAC as "DingTalkAuthClient"
|
|
|
|
|
participant TS as "TokenService"
|
|
|
|
|
participant JF as "JwtAuthenticationFilter"
|
|
|
|
|
participant DSI as "DataScopeInterceptor"
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
participant FileApi as "FileApi"
|
|
|
|
|
C->>AC : "POST /auth/login"
|
|
|
|
|
AC->>AS : "login(LoginParam)"
|
|
|
|
|
AS->>DTAC : "获取用户信息"
|
|
|
|
|
AS->>DTAC : "事务外组织准入预校验"
|
|
|
|
|
DTAC-->>AS : "组织成员验证结果"
|
|
|
|
|
AS->>AUS : "事务内DB操作"
|
|
|
|
|
AS->>AIS : "身份绑定与校验"
|
|
|
|
|
AS-->>AC : "认证成功"
|
|
|
|
|
AC->>TS : "签发JWT(含用户ID/角色/权限/数据范围)"
|
|
|
|
|
TS-->>AC : "返回Token"
|
|
|
|
|
AC-->>C : "LoginResultDTO{token,...}"
|
|
|
|
|
C->>RLC : "POST /api/roles/page (分页查询)"
|
|
|
|
|
RLC->>SRS : "saveRole(role)"
|
|
|
|
|
SRS->>SRS : "数据完整性校验"
|
|
|
|
|
SRS-->>RLC : "保存成功"
|
|
|
|
|
RLC-->>C : "角色操作结果"
|
|
|
|
|
C->>AC : "带Authorization的请求"
|
|
|
|
|
AC->>JF : "解析JWT并构建认证上下文"
|
|
|
|
|
JF->>DSI : "设置数据权限范围"
|
|
|
|
|
DSI-->>AC : "注入SQL数据范围片段"
|
|
|
|
|
AC-->>C : "受保护资源"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
图表来源
|
|
|
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
|
|
|
|
- [RoleController.java](file://crm-auth/src/main/java/com/crm/auth/controller/RoleController.java)
|
|
|
|
|
- [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java)
|
|
|
|
|
- [SysRoleServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysRoleServiceImpl.java)
|
|
|
|
|
- [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java)
|
|
|
|
|
- [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java)
|
|
|
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
|
|
|
|
|
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
|
|
|
|
|
- [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java)
|
|
|
|
|
- [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [FileApi.java](file://crm-file/src/main/java/com/crm/file/api/FileApi.java)
|
|
|
|
|
|
|
|
|
|
## 详细组件分析
|
|
|
|
|
|
|
|
|
|
### 安全配置与过滤器链
|
|
|
|
|
- SecurityConfig:集中配置白名单、跨域、会话策略、异常处理器;将 JwtAuthenticationFilter 加入过滤器链;可配置是否启用基于注解的权限控制。
|
|
|
|
|
- JwtAuthenticationFilter:从请求头提取 Token,调用 TokenService 解析并填充认证上下文,供后续控制器与拦截器使用。
|
|
|
|
|
- DataScopeInterceptor:根据当前用户的 DataScopeEnum 与部门关系,动态拼接 SQL 条件,确保只返回允许的数据行。
|
|
|
|
|
- SecurityExceptionHandlers:捕获未认证、无权限、参数错误等异常,统一返回标准响应。
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
flowchart TD
|
|
|
|
|
Start(["请求进入"]) --> CheckPath["匹配白名单/静态资源"]
|
|
|
|
|
CheckPath --> |放行| Next["继续业务处理"]
|
|
|
|
|
CheckPath --> |需认证| Extract["提取Authorization头"]
|
|
|
|
|
Extract --> Parse["TokenService解析JWT"]
|
|
|
|
|
Parse --> Valid{"Token有效?"}
|
|
|
|
|
Valid --> |否| Deny["拒绝访问(401/403)"]
|
|
|
|
|
Valid --> |是| SetCtx["设置认证上下文(AuthLoginUser)"]
|
|
|
|
|
SetCtx --> Scope["DataScopeInterceptor注入数据范围"]
|
|
|
|
|
Scope --> Next
|
|
|
|
|
Next --> End(["返回响应"])
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
图表来源
|
|
|
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
|
|
|
|
- [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java)
|
|
|
|
|
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
|
|
|
|
|
- [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java)
|
|
|
|
|
- [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java)
|
|
|
|
|
|
|
|
|
|
章节来源
|
|
|
|
|
- [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
|
|
|
|
- [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java)
|
|
|
|
|
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
|
|
|
|
|
- [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java)
|
|
|
|
|
- [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java)
|
|
|
|
|
|
|
|
|
|
### 认证流程与令牌处理
|
|
|
|
|
- 登录流程:AuthController 接收 LoginParam,AuthServiceImpl 调用用户与身份服务进行校验,成功后由 TokenService 签发 JWT,返回 LoginResultDTO。
|
|
|
|
|
- 令牌处理:TokenService 负责生成、解析、刷新、失效策略;JwtAuthenticationFilter 在每个请求中解析并设置认证上下文。
|
|
|
|
|
- 会话管理:建议无状态化(JWT),如需限流或黑名单可在 TokenService 中扩展 Redis 存储。
|
|
|
|
|
|
|
|
|
|
**更新** 登录流程现已优化,组织准入校验在事务外执行,避免长时间占用数据库连接。
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
sequenceDiagram
|
|
|
|
|
participant Client as "客户端"
|
|
|
|
|
participant AC as "AuthController"
|
|
|
|
|
participant AS as "AuthServiceImpl"
|
|
|
|
|
participant DTAC as "DingTalkAuthClient"
|
|
|
|
|
participant AUS as "AuthUserServiceImpl"
|
|
|
|
|
participant AIS as "AuthIdentityServiceImpl"
|
|
|
|
|
participant TS as "TokenService"
|
|
|
|
|
Client->>AC : "POST /auth/login"
|
|
|
|
|
AC->>AS : "login(LoginParam)"
|
|
|
|
|
AS->>DTAC : "获取用户信息"
|
|
|
|
|
AS->>DTAC : "事务外组织准入预校验"
|
|
|
|
|
DTAC-->>AS : "组织成员验证"
|
|
|
|
|
AS->>AUS : "事务内DB操作"
|
|
|
|
|
AS->>AIS : "身份绑定"
|
|
|
|
|
AS-->>AC : "成功"
|
|
|
|
|
AC->>TS : "createToken(user, roles, dataScope)"
|
|
|
|
|
TS-->>AC : "token"
|
|
|
|
|
AC-->>Client : "LoginResultDTO(token, userInfo)"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
图表来源
|
|
|
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
|
|
|
|
- [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java)
|
|
|
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
|
|
|
|
|
- [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java)
|
|
|
|
|
- [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java)
|
|
|
|
|
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
|
|
|
|
|
- [LoginParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/LoginParam.java)
|
|
|
|
|
- [LoginResultDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/LoginResultDTO.java)
|
|
|
|
|
|
|
|
|
|
章节来源
|
|
|
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
|
|
|
|
- [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java)
|
|
|
|
|
- [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java)
|
|
|
|
|
- [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java)
|
|
|
|
|
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
|
|
|
|
|
- [LoginParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/LoginParam.java)
|
|
|
|
|
- [LoginResultDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/LoginResultDTO.java)
|
|
|
|
|
|
|
|
|
|
### 权限管理与数据权限控制
|
|
|
|
|
- 角色与菜单:SysRole 与 SysMenu 建立 RBAC 模型,支持菜单与按钮级权限标识。
|
|
|
|
|
- 用户-角色-部门:SysUserRole、SysUserDept 维护用户与角色、部门的关联。
|
|
|
|
|
- 数据权限:DataScopeEnum 定义数据可见范围(全部、本部门、本部门及以下、本人等),DataScopeInterceptor 根据当前用户范围注入 SQL 片段。
|
|
|
|
|
- 权限检查:可通过注解或拦截器对接口进行权限校验,结合菜单标识与角色集合判断。
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
classDiagram
|
|
|
|
|
class AuthUser {
|
|
|
|
|
+id
|
|
|
|
|
+username
|
|
|
|
|
+status
|
|
|
|
|
}
|
|
|
|
|
class SysRole {
|
|
|
|
|
+id
|
|
|
|
|
+roleName
|
|
|
|
|
+roleCode
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
+dataScope
|
|
|
|
|
+builtin
|
|
|
|
|
}
|
|
|
|
|
class SysMenu {
|
|
|
|
|
+id
|
|
|
|
|
+name
|
|
|
|
|
+type
|
|
|
|
|
+permission
|
|
|
|
|
}
|
|
|
|
|
class SysUserRole {
|
|
|
|
|
+userId
|
|
|
|
|
+roleId
|
|
|
|
|
}
|
|
|
|
|
class SysRoleMenu {
|
|
|
|
|
+roleId
|
|
|
|
|
+menuId
|
|
|
|
|
}
|
|
|
|
|
class SysDept {
|
|
|
|
|
+id
|
|
|
|
|
+name
|
|
|
|
|
+parentId
|
|
|
|
|
}
|
|
|
|
|
class SysUserDept {
|
|
|
|
|
+userId
|
|
|
|
|
+deptId
|
|
|
|
|
}
|
|
|
|
|
class DataScopeEnum {
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
+ALL
|
|
|
|
|
+DEPT
|
|
|
|
|
+DEPT_AND_BELOW
|
|
|
|
|
+SELF
|
|
|
|
|
}
|
|
|
|
|
AuthUser ||--o{ SysUserRole : "拥有"
|
|
|
|
|
SysRole ||--o{ SysUserRole : "分配给"
|
|
|
|
|
SysRole ||--o{ SysRoleMenu : "包含"
|
|
|
|
|
SysMenu ||--o{ SysRoleMenu : "被包含"
|
|
|
|
|
AuthUser ||--o{ SysUserDept : "属于"
|
|
|
|
|
SysDept ||--o{ SysUserDept : "包含"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
图表来源
|
|
|
|
|
- [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java)
|
|
|
|
|
- [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java)
|
|
|
|
|
- [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java)
|
|
|
|
|
- [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java)
|
|
|
|
|
- [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java)
|
|
|
|
|
- [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java)
|
|
|
|
|
- [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java)
|
|
|
|
|
- [DataScopeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/DataScopeEnum.java)
|
|
|
|
|
|
|
|
|
|
章节来源
|
|
|
|
|
- [ISysRoleService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysRoleService.java)
|
|
|
|
|
- [SysRoleServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysRoleServiceImpl.java)
|
|
|
|
|
- [ISysMenuService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysMenuService.java)
|
|
|
|
|
- [SysMenuServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysMenuServiceImpl.java)
|
|
|
|
|
- [ISysDeptService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysDeptService.java)
|
|
|
|
|
- [SysDeptServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysDeptServiceImpl.java)
|
|
|
|
|
- [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java)
|
|
|
|
|
- [DataScopeTables.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeTables.java)
|
|
|
|
|
- [DataScopeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/DataScopeEnum.java)
|
|
|
|
|
|
|
|
|
|
### 角色管理系统
|
|
|
|
|
**新增** 完整的角色管理系统提供了专业的RBAC角色管理功能,支持角色的CRUD操作、权限分配和数据完整性校验。
|
|
|
|
|
|
|
|
|
|
- **RoleController**:提供RESTful API接口,包括角色分页查询、保存编辑、详情获取、权限分配和级联删除功能
|
|
|
|
|
- **SysRoleServiceImpl**:实现复杂的业务验证逻辑,包括角色编码唯一性、内置角色保护、数据范围验证、祖先节点补全等
|
|
|
|
|
- **RoleDetailVO**:数据传输对象,包含角色基本信息和已授权的完整资源集合
|
|
|
|
|
- **数据完整性保障**:内置角色保护机制、角色编码唯一性校验、数据范围有效性验证
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
sequenceDiagram
|
|
|
|
|
participant Client as "客户端"
|
|
|
|
|
participant RLC as "RoleController"
|
|
|
|
|
participant SRS as "SysRoleServiceImpl"
|
|
|
|
|
participant SM as "ISysMenuService"
|
|
|
|
|
participant SRM as "SysRoleMenuMapper"
|
|
|
|
|
participant SUR as "SysUserRoleMapper"
|
|
|
|
|
Client->>RLC : "POST /api/roles/saveOrUpdate"
|
|
|
|
|
RLC->>SRS : "saveRole(role)"
|
|
|
|
|
SRS->>SRS : "验证角色名称非空"
|
|
|
|
|
SRS->>SRS : "验证角色编码非空"
|
|
|
|
|
SRS->>SRS : "验证数据范围有效性"
|
|
|
|
|
SRS->>SRS : "检查角色编码唯一性"
|
|
|
|
|
SRS->>SRS : "内置角色保护检查"
|
|
|
|
|
SRS-->>RLC : "保存成功"
|
|
|
|
|
RLC-->>Client : "操作结果"
|
|
|
|
|
Client->>RLC : "POST /api/roles/assign-resources"
|
|
|
|
|
RLC->>SRS : "assignResources(roleId, resourceIds)"
|
|
|
|
|
SRS->>SM : "getAncestorIds(resourceIds)"
|
|
|
|
|
SM-->>SRS : "祖先节点ID集合"
|
|
|
|
|
SRS->>SRM : "delete(sys_role_menu)"
|
|
|
|
|
SRS->>SRM : "insert(完整资源映射)"
|
|
|
|
|
SRS-->>RLC : "权限分配成功"
|
|
|
|
|
RLC-->>Client : "分配结果"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
图表来源
|
|
|
|
|
- [RoleController.java](file://crm-auth/src/main/java/com/crm/auth/controller/RoleController.java)
|
|
|
|
|
- [SysRoleServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysRoleServiceImpl.java)
|
|
|
|
|
- [ISysRoleService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysRoleService.java)
|
|
|
|
|
- [RoleDetailVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/RoleDetailVO.java)
|
|
|
|
|
- [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java)
|
|
|
|
|
- [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java)
|
|
|
|
|
|
|
|
|
|
**Section sources**
|
|
|
|
|
- [RoleController.java:1-98](file://crm-auth/src/main/java/com/crm/auth/controller/RoleController.java#L1-L98)
|
|
|
|
|
- [SysRoleServiceImpl.java:1-137](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysRoleServiceImpl.java#L1-L137)
|
|
|
|
|
- [ISysRoleService.java:1-43](file://crm-auth/src/main/java/com/crm/auth/service/ISysRoleService.java#L1-L43)
|
|
|
|
|
- [RoleDetailVO.java:1-61](file://crm-auth/src/main/java/com/crm/auth/domain/dto/RoleDetailVO.java#L1-L61)
|
|
|
|
|
- [SysRole.java:1-41](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java#L1-L41)
|
|
|
|
|
- [SysRoleMenu.java:1-31](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java#L1-L31)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
|
|
|
|
|
### 统一权限资源管理功能
|
|
|
|
|
**新增** 统一权限资源管理功能提供了完整的资源树CRUD操作,支持目录、菜单、按钮三种类型的层级管理。
|
|
|
|
|
|
|
|
|
|
- **ResourceController**:提供RESTful API接口,包括资源树查询、新增编辑、删除和图标上传功能
|
|
|
|
|
- **ResourceServiceImpl**:实现复杂的业务验证逻辑,包括层级约束、字段必填校验、编辑锁机制
|
|
|
|
|
- **ResourceNode**:数据传输对象,支持不同资源类型的字段映射和转换
|
|
|
|
|
- **文件上传集成**:与FileApi服务集成,支持图标上传、格式校验和大小限制
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
sequenceDiagram
|
|
|
|
|
participant Client as "客户端"
|
|
|
|
|
participant RC as "ResourceController"
|
|
|
|
|
participant RSVC as "ResourceServiceImpl"
|
|
|
|
|
participant SM as "ISysMenuService"
|
|
|
|
|
participant FR as "FileApi"
|
|
|
|
|
Client->>RC : "GET /api/resources"
|
|
|
|
|
RC->>RSVC : "listAll()"
|
|
|
|
|
RSVC->>SM : "查询所有菜单"
|
|
|
|
|
SM-->>RSVC : "菜单列表"
|
|
|
|
|
RSVC-->>RC : "ResourceNode[]扁平数组"
|
|
|
|
|
RC-->>Client : "资源树数据"
|
|
|
|
|
Client->>RC : "POST /api/resources (保存节点)"
|
|
|
|
|
RC->>RSVC : "save(ResourceNode)"
|
|
|
|
|
RSVC->>RSVC : "验证层级约束"
|
|
|
|
|
RSVC->>RSVC : "验证字段必填"
|
|
|
|
|
RSVC->>SM : "saveOrUpdate(entity)"
|
|
|
|
|
SM-->>RSVC : "保存成功"
|
|
|
|
|
RSVC-->>RC : "ResourceNode"
|
|
|
|
|
RC-->>Client : "保存结果"
|
|
|
|
|
Client->>RC : "POST /api/resources/icon/upload"
|
|
|
|
|
RC->>RSVC : "uploadIcon(file)"
|
|
|
|
|
RSVC->>RSVC : "文件格式校验"
|
|
|
|
|
RSVC->>FR : "upload(content, name, type, domain)"
|
|
|
|
|
FR-->>RSVC : "FileInfoDTO"
|
|
|
|
|
RSVC-->>RC : "FileInfoDTO"
|
|
|
|
|
RC-->>Client : "上传结果"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
图表来源
|
|
|
|
|
- [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java)
|
|
|
|
|
- [ResourceServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java)
|
|
|
|
|
- [IResourceService.java](file://crm-auth/src/main/java/com/crm/auth/service/IResourceService.java)
|
|
|
|
|
- [ResourceNode.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java)
|
|
|
|
|
- [FileApi.java](file://crm-file/src/main/java/com/crm/file/api/FileApi.java)
|
|
|
|
|
|
|
|
|
|
**Section sources**
|
|
|
|
|
- [ResourceController.java:1-48](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java#L1-L48)
|
|
|
|
|
- [ResourceServiceImpl.java:1-262](file://crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java#L1-L262)
|
|
|
|
|
- [IResourceService.java:1-26](file://crm-auth/src/main/java/com/crm/auth/service/IResourceService.java#L1-L26)
|
|
|
|
|
- [ResourceNode.java:1-80](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java#L1-L80)
|
|
|
|
|
- [FileApi.java:1-106](file://crm-file/src/main/java/com/crm/file/api/FileApi.java#L1-L106)
|
|
|
|
|
|
|
|
|
|
### 第三方登录与企业级安全集成
|
|
|
|
|
- 抽象与工厂:ThirdPartyAuthClient 定义统一接口,ThirdPartyAuthClientFactory 根据类型创建具体客户端。
|
|
|
|
|
- 钉钉实现:DingTalkAuthClient 对接钉钉 API,获取用户信息并转换为 ThirdPartyUserInfo。
|
|
|
|
|
- **企业级安全特性**:新增组织成员验证系统,通过企业级token管理确保只有组织成员才能登录。
|
|
|
|
|
- **Redis缓存优化**:企业级token采用7000秒TTL缓存,减少频繁API调用。
|
|
|
|
|
- 集成流程:前端跳转钉钉授权 -> 回调携带 code -> 服务端换取 access_token -> 拉取用户信息 -> **组织成员验证** -> 本地用户绑定/自动注册 -> 签发 JWT。
|
|
|
|
|
|
|
|
|
|
**更新** 第三方登录现已支持企业级安全验证,通过钉钉组织通讯录API验证用户是否为组织成员。
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
sequenceDiagram
|
|
|
|
|
participant Client as "客户端"
|
|
|
|
|
participant AC as "AuthController"
|
|
|
|
|
participant AS as "AuthServiceImpl"
|
|
|
|
|
participant DTAC as "DingTalkAuthClient"
|
|
|
|
|
participant Redis as "Redis缓存"
|
|
|
|
|
participant TS as "TokenService"
|
|
|
|
|
Client->>AC : "GET /auth/thirdparty/dingtalk/callback?code=..."
|
|
|
|
|
AC->>AS : "thirdPartyLogin(type, code)"
|
|
|
|
|
AS->>DTAC : "getAccessToken(code)"
|
|
|
|
|
DTAC-->>AS : "accessToken"
|
|
|
|
|
AS->>DTAC : "getUserInfo(accessToken)"
|
|
|
|
|
DTAC-->>AS : "ThirdPartyUserInfo"
|
|
|
|
|
AS->>DTAC : "isOrgMember(unionId)"
|
|
|
|
|
DTAC->>Redis : "获取企业级token缓存"
|
|
|
|
|
alt 缓存命中
|
|
|
|
|
Redis-->>DTAC : "corpToken"
|
|
|
|
|
else 缓存未命中
|
|
|
|
|
DTAC->>DTAC : "requestCorpTokenApi()"
|
|
|
|
|
DTAC->>Redis : "缓存corpToken(TTL : 7000s)"
|
|
|
|
|
end
|
|
|
|
|
DTAC->>DTAC : "requestGetByUnionIdApi(corpToken, unionId)"
|
|
|
|
|
DTAC-->>AS : "组织成员验证结果"
|
|
|
|
|
AS->>AS : "查找/绑定本地用户"
|
|
|
|
|
AS->>TS : "createToken(user, roles, dataScope)"
|
|
|
|
|
TS-->>AC : "token"
|
|
|
|
|
AC-->>Client : "LoginResultDTO(token)"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
图表来源
|
|
|
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
|
|
|
|
- [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java)
|
|
|
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
|
|
|
|
|
- [ThirdPartyAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClient.java)
|
|
|
|
|
- [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java)
|
|
|
|
|
- [ThirdPartyUserInfo.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyUserInfo.java)
|
|
|
|
|
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
|
|
|
|
|
|
|
|
|
|
章节来源
|
|
|
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
|
|
|
|
|
- [ThirdPartyAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClient.java)
|
|
|
|
|
- [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java)
|
|
|
|
|
- [ThirdPartyUserInfo.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyUserInfo.java)
|
|
|
|
|
- [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java)
|
|
|
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
|
|
|
|
|
|
|
|
|
### 用户与会话管理
|
|
|
|
|
- 用户上下文:AuthLoginUser 封装用户基本信息、角色、权限、数据权限范围,便于全链路使用。
|
|
|
|
|
- 会话策略:推荐无状态 JWT;如需在线用户统计、强制下线等,可在 TokenService 中引入 Redis 做黑名单或在线列表。
|
|
|
|
|
- 初始化数据:DataInitializer 用于启动时预置基础角色、菜单、部门等数据。
|
|
|
|
|
|
|
|
|
|
**更新** 会话管理现已支持滑动过期机制,当剩余有效期不足一半时自动续期,提升用户体验。
|
|
|
|
|
|
|
|
|
|
章节来源
|
|
|
|
|
- [AuthLoginUser.java](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java)
|
|
|
|
|
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
|
|
|
|
|
- [DataInitializer.java](file://crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java)
|
|
|
|
|
|
|
|
|
|
### 用户列表分页查询功能
|
|
|
|
|
- 分页参数设计:UserPageParam 支持灵活的查询条件组合,包括用户名模糊搜索、手机号精确匹配、用户状态筛选、部门选择等
|
|
|
|
|
- 数据传输优化:UserListDTO 精简了用户信息字段,避免敏感数据泄露,同时包含必要的关联信息
|
|
|
|
|
- 统计分析能力:UserStatsVO 提供用户数据的统计分析,帮助管理员了解用户分布和使用情况
|
|
|
|
|
- 性能优化:采用 MyBatis Plus 分页插件,支持高效的大数据量分页查询
|
|
|
|
|
|
|
|
|
|
章节来源
|
|
|
|
|
- [UserPageParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/UserPageParam.java)
|
|
|
|
|
- [UserListDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserListDTO.java)
|
|
|
|
|
- [UserStatsVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserStatsVO.java)
|
|
|
|
|
- [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java)
|
|
|
|
|
|
|
|
|
|
## 依赖关系分析
|
|
|
|
|
- 控制器依赖服务层,服务层依赖领域模型与枚举,安全组件贯穿请求生命周期。
|
|
|
|
|
- 第三方登录通过工厂解耦不同平台实现,便于扩展。
|
|
|
|
|
- 数据权限通过拦截器与表名映射(DataScopeTables)组合,降低对业务代码侵入。
|
|
|
|
|
- 用户列表功能通过 DTO 模式解耦查询参数和返回数据,提高代码可维护性。
|
|
|
|
|
- **企业级安全特性通过Redis缓存和钉钉API集成,形成独立的安全验证层**。
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- **资源管理功能通过ResourceController和ResourceServiceImpl实现,与文件上传服务集成**。
|
|
|
|
|
- **角色管理功能通过RoleController和SysRoleServiceImpl实现,提供完整的RBAC管理能力**。
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
graph LR
|
|
|
|
|
AC["AuthController"] --> AS["AuthServiceImpl"]
|
|
|
|
|
AC --> AUS["AuthUserServiceImpl"]
|
|
|
|
|
AC --> AIS["AuthIdentityServiceImpl"]
|
|
|
|
|
SYSC["SystemController"] --> SRS["SysRoleServiceImpl"]
|
|
|
|
|
SYSC --> SMS["SysMenuServiceImpl"]
|
|
|
|
|
SYSC --> SDS["SysDeptServiceImpl"]
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
RC["ResourceController"] --> RSVC["ResourceServiceImpl"]
|
|
|
|
|
RLC["RoleController"] --> SRS
|
|
|
|
|
SRS --> IMS["ISysMenuService"]
|
|
|
|
|
SRS --> SRM["SysRoleMenuMapper"]
|
|
|
|
|
SRS --> SUR["SysUserRoleMapper"]
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
RSVC --> FileApi["FileApi"]
|
|
|
|
|
JF["JwtAuthenticationFilter"] --> TS["TokenService"]
|
|
|
|
|
DSI["DataScopeInterceptor"] --> ALU["AuthLoginUser"]
|
|
|
|
|
DTAC["DingTalkAuthClient"] --> TPACF["ThirdPartyAuthClientFactory"]
|
|
|
|
|
DTAC --> Redis["Redis缓存"]
|
|
|
|
|
UPM["UserPageParam"] --> AUS
|
|
|
|
|
ULDTO["UserListDTO"] --> AC
|
|
|
|
|
USVO["UserStatsVO"] --> AC
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
RN["ResourceNode"] --> RSVC
|
|
|
|
|
RDV["RoleDetailVO"] --> SRS
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
图表来源
|
|
|
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java)
|
|
|
|
|
- [RoleController.java](file://crm-auth/src/main/java/com/crm/auth/controller/RoleController.java)
|
|
|
|
|
- [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java)
|
|
|
|
|
- [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java)
|
|
|
|
|
- [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java)
|
|
|
|
|
- [SystemController.java](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java)
|
|
|
|
|
- [SysRoleServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysRoleServiceImpl.java)
|
|
|
|
|
- [SysMenuServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysMenuServiceImpl.java)
|
|
|
|
|
- [SysDeptServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysDeptServiceImpl.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [ResourceServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java)
|
|
|
|
|
- [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java)
|
|
|
|
|
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
|
|
|
|
|
- [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java)
|
|
|
|
|
- [AuthLoginUser.java](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java)
|
|
|
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
|
|
|
|
|
- [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java)
|
|
|
|
|
- [UserPageParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/UserPageParam.java)
|
|
|
|
|
- [UserListDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserListDTO.java)
|
|
|
|
|
- [UserStatsVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserStatsVO.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [ResourceNode.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java)
|
|
|
|
|
- [RoleDetailVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/RoleDetailVO.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [FileApi.java](file://crm-file/src/main/java/com/crm/file/api/FileApi.java)
|
|
|
|
|
|
|
|
|
|
章节来源
|
|
|
|
|
- [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [ResourceController.java](file://crm-auth/src/main/java/com/crm/auth/controller/ResourceController.java)
|
|
|
|
|
- [RoleController.java](file://crm-auth/src/main/java/com/crm/auth/controller/RoleController.java)
|
|
|
|
|
- [SystemController.java](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java)
|
|
|
|
|
- [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java)
|
|
|
|
|
- [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java)
|
|
|
|
|
- [AuthIdentityServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthIdentityServiceImpl.java)
|
|
|
|
|
- [SysRoleServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysRoleServiceImpl.java)
|
|
|
|
|
- [SysMenuServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysMenuServiceImpl.java)
|
|
|
|
|
- [SysDeptServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysDeptServiceImpl.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [ResourceServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java)
|
|
|
|
|
- [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java)
|
|
|
|
|
- [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
|
|
|
|
|
- [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java)
|
|
|
|
|
- [AuthLoginUser.java](file://crm-auth/src/main/java/com/crm/auth/security/AuthLoginUser.java)
|
|
|
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
|
|
|
|
|
- [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java)
|
|
|
|
|
- [UserPageParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/UserPageParam.java)
|
|
|
|
|
- [UserListDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserListDTO.java)
|
|
|
|
|
- [UserStatsVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserStatsVO.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [ResourceNode.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/ResourceNode.java)
|
|
|
|
|
- [RoleDetailVO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/RoleDetailVO.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [FileApi.java](file://crm-file/src/main/java/com/crm/file/api/FileApi.java)
|
|
|
|
|
|
|
|
|
|
## 性能考虑
|
|
|
|
|
- JWT 解析开销:避免在 TokenService 中进行重型计算;必要时缓存用户角色/权限集合。
|
|
|
|
|
- 数据权限 SQL 注入:尽量复用 MyBatis 分页插件与条件构造器,减少字符串拼接带来的性能损耗。
|
|
|
|
|
- 第三方登录:对钉钉等外部 API 调用增加超时与重试策略,避免阻塞主线程。
|
|
|
|
|
- 缓存策略:对菜单树、角色-权限映射、部门树等热点数据引入缓存(如 Redis)。
|
|
|
|
|
- 无状态会话:避免服务端 Session 存储,提升水平扩展能力。
|
|
|
|
|
- 分页查询优化:合理使用数据库索引,避免深分页问题,支持大数据量高效查询。
|
|
|
|
|
- **企业级token缓存**:钉钉企业级token采用7000秒TTL缓存,显著减少API调用频率。
|
|
|
|
|
- **事务优化**:组织准入校验移至事务外执行,避免长时间占用数据库连接。
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- **资源管理性能**:资源树查询采用扁平数组返回,前端按需构建树形结构,减少后端计算开销。
|
|
|
|
|
- **文件上传优化**:图标上传支持格式和大小校验,避免大文件传输影响系统性能。
|
|
|
|
|
- **角色管理性能**:权限分配采用祖先节点自动补全,减少前端计算负担,提升用户体验。
|
|
|
|
|
|
|
|
|
|
## 故障排查指南
|
|
|
|
|
- 常见错误
|
|
|
|
|
- 401 未认证:检查 Authorization 头格式、Token 是否过期、过滤器链是否生效
|
|
|
|
|
- 403 无权限:检查用户角色与接口权限标识是否匹配,菜单权限是否正确配置
|
|
|
|
|
- 数据越权:确认 DataScopeEnum 与用户-部门关系是否正确,拦截器是否注入成功
|
|
|
|
|
- 第三方登录失败:核对 AppKey/AppSecret、回调地址、网络连通性与签名校验
|
|
|
|
|
- **组织成员验证失败**:检查unionId有效性、企业级token状态、钉钉API权限配置
|
|
|
|
|
- **Redis缓存异常**:验证Redis连接状态、缓存key正确性、TTL配置合理性
|
|
|
|
|
- 分页查询异常:检查分页参数合法性、数据库连接状态、索引使用情况
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- **资源管理错误**:检查资源节点层级约束、字段必填校验、编辑锁机制
|
|
|
|
|
- **文件上传失败**:验证文件格式、大小限制、FileApi服务可用性
|
|
|
|
|
- **角色管理错误**:检查角色编码唯一性、内置角色保护、数据范围验证
|
|
|
|
|
- 定位手段
|
|
|
|
|
- 开启调试日志,查看 JwtAuthenticationFilter 解析过程
|
|
|
|
|
- 打印 DataScopeInterceptor 注入的 SQL 片段,验证数据范围
|
|
|
|
|
- 检查 SecurityExceptionHandlers 返回的错误码与消息
|
|
|
|
|
- **监控企业级token缓存命中率,分析缓存失效原因**
|
|
|
|
|
- **跟踪组织准入校验流程,定位API调用失败点**
|
|
|
|
|
- 监控分页查询性能,分析慢查询日志
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- **检查资源管理验证逻辑,定位业务规则冲突**
|
|
|
|
|
- **监控文件上传性能,分析IO瓶颈**
|
|
|
|
|
- **检查角色管理数据完整性,验证业务规则执行情况**
|
|
|
|
|
- 修复建议
|
|
|
|
|
- 修正白名单配置,避免误放行敏感接口
|
|
|
|
|
- 完善用户-角色-部门关联数据
|
|
|
|
|
- 优化第三方客户端超时与重试配置
|
|
|
|
|
- **配置合理的Redis缓存TTL,避免频繁失效**
|
|
|
|
|
- **验证钉钉企业级应用权限配置**
|
|
|
|
|
- 优化分页查询SQL,添加合适的数据库索引
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- **调整资源管理验证规则,确保业务逻辑正确**
|
|
|
|
|
- **优化文件上传配置,支持更大文件和更多格式**
|
|
|
|
|
- **完善角色管理数据校验,确保数据一致性**
|
|
|
|
|
|
|
|
|
|
章节来源
|
|
|
|
|
- [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java)
|
|
|
|
|
- [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java)
|
|
|
|
|
- [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java)
|
|
|
|
|
- [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java)
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- [ResourceServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/ResourceServiceImpl.java)
|
|
|
|
|
- [SysRoleServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysRoleServiceImpl.java)
|
|
|
|
|
|
|
|
|
|
## 结论
|
|
|
|
|
认证服务模块通过清晰的分层设计与安全组件协作,实现了完整的认证、授权与数据权限控制能力。**最新更新引入的统一权限资源管理功能和完整的角色管理系统显著提升了系统的安全性和可靠性**。通过事务外组织准入校验、Redis缓存机制、增强的错误处理和完善的资源管理功能,系统在保持高性能的同时提供了更强的安全保障。JWT 无状态化提升了可扩展性,RBAC 与数据权限满足企业级权限需求,第三方登录框架便于快速接入新平台,统一的资源管理功能和角色管理功能为权限配置提供了灵活的界面支持。建议在部署时关注安全配置、缓存策略、外部依赖稳定性和资源管理验证规则,以获得更好的性能与可靠性。
|
|
|
|
|
|
|
|
|
|
## 附录
|
|
|
|
|
- 安全最佳实践
|
|
|
|
|
- 最小权限原则:仅授予必要角色与菜单权限
|
|
|
|
|
- 强口令策略与登录失败锁定
|
|
|
|
|
- HTTPS 传输与 Token 短期有效期
|
|
|
|
|
- 定期审计角色与权限变更
|
|
|
|
|
- **企业级安全验证:确保所有第三方登录用户都是组织成员**
|
|
|
|
|
- **Redis缓存安全:合理设置TTL,防止敏感信息长期缓存**
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- **资源管理安全:严格验证资源节点层级关系和字段完整性**
|
|
|
|
|
- **角色管理安全:确保角色编码唯一性,保护内置角色不被修改**
|
|
|
|
|
- 自定义扩展方法
|
|
|
|
|
- 新增第三方平台:实现 ThirdPartyAuthClient 接口并在工厂中注册
|
|
|
|
|
- 扩展数据权限:在 DataScopeInterceptor 中增加新的 DataScopeEnum 分支
|
|
|
|
|
- 增强权限校验:在 PermissionConfig 中启用注解式权限控制
|
|
|
|
|
- 扩展用户查询条件:在 UserPageParam 中添加新的筛选字段
|
|
|
|
|
- **扩展企业级验证:为新平台实现组织成员验证逻辑**
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- **扩展资源管理:为新资源类型添加验证规则和字段映射**
|
|
|
|
|
- **扩展角色管理:为新角色类型添加特定的业务规则和权限控制**
|
|
|
|
|
- 企业级安全配置指南
|
|
|
|
|
- **钉钉企业级应用配置:确保开通组织通讯录权限**
|
|
|
|
|
- **Redis缓存配置:合理设置企业级token TTL为7000秒**
|
|
|
|
|
- **事务边界管理:确保组织校验不在事务内执行**
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
1 month ago
|
|
|
- **错误处理机制:实现专门的组织成员验证错误码**
|
|
|
|
|
- **资源管理配置:配置合理的文件上传大小限制和格式白名单**
|
|
|
|
|
- **性能监控:监控资源管理API响应时间和文件上传性能**
|
|
|
|
|
- **角色管理配置:配置合理的角色编码规范和权限分配策略**
|
|
|
|
|
- **数据完整性保障:实施严格的角色数据校验和约束机制**
|