Quasar前端用户角色枚举修正方案
# 前端用户角色枚举修正方案
根据最新的DRF后端角色定义,我已修正了前端 `UserRole` 枚举,确保前后端角色定义完全一致:
```typescript
/**
* 用户角色枚举(与后端完全同步)
*
* 设计原则:
* 1. 职责分离: 隐患排查与治理分离
* 2. 最小特权: 每个角色仅分配必要权限
* 3. 审计独立: 审计员独立监督
*
* 安全标准:
* - ISO/IEC 27001 信息安全管理
* - NIST RBAC 基于角色的访问控制
*
* 角色层级:
* 隐患排查员(10) < 隐患治理员(15) < 安全管理员(20) < 审计员(30) < 系统管理员(99)
*/
export enum UserRole {
/**
* 隐患排查员
* - 职责: 发现和报告安全隐患
* - 权限: 创建隐患报告、查看自有报告、上传现场照片
* - 限制: 不能分配任务、不能关闭报告
*/
HAZARD_INSPECTOR = 10,
/**
* 隐患治理员 (新增)
* - 职责: 整改验证和闭环管理
* - 权限: 分配整改任务、验证整改结果、关闭隐患
* - 限制: 不能创建新报告、不能修改原始描述
*/
HAZARD_RECTIFIER = 15,
/**
* 安全管理员
* - 职责: 整体安全管理和用户配置
* - 权限: 用户管理、角色分配、系统配置
* - 限制: 不能操作审计日志、不能提升自身权限
*/
SECURITY_ADMIN = 20,
/**
* 安全审计员
* - 职责: 独立审计和监督
* - 权限: 查看所有操作日志、导出审计数据、标记可疑操作
* - 限制: 不能修改业务数据、不能执行管理操作
*/
AUDITOR = 30,
/**
* 系统管理员
* - 职责: 基础设施维护
* - 权限: 服务器管理、备份恢复、系统监控
* - 限制: 不能访问业务数据、操作需双重认证
*/
SYSTEM_ADMIN = 99,
}
// 辅助类型和函数
export namespace UserRole {
/**
* 获取角色显示名称
* @param role 用户角色值
* @returns 本地化的角色名称
*/
export function getLabel(role: UserRole): string {
switch (role) {
case UserRole.HAZARD_INSPECTOR:
return '隐患排查员'
case UserRole.HAZARD_RECTIFIER:
return '隐患治理员'
case UserRole.SECURITY_ADMIN:
return '安全管理员'
case UserRole.AUDITOR:
return '安全审计员'
case UserRole.SYSTEM_ADMIN:
return '系统管理员'
default:
return '未知角色'
}
}
/**
* 检查用户是否有权限执行操作
* @param userRole 当前用户角色
* @param requiredRole 要求的最低角色
* @returns 是否有权限
*/
export function hasPermission(
userRole: UserRole,
requiredRole: UserRole
): boolean {
return userRole >= requiredRole
}
/**
* 检查用户是否具有特定角色
* @param userRole 当前用户角色
* @param targetRole 检查的目标角色
* @returns 是否具有该角色
*/
export function isRole(
userRole: UserRole,
targetRole: UserRole
): boolean {
return userRole === targetRole
}
/**
* 获取角色层级中的所有角色
* @param minRole 最低角色(包含)
* @param maxRole 最高角色(包含)
* @returns 角色范围内的角色数组
*/
export function getRolesInRange(
minRole: UserRole = UserRole.HAZARD_INSPECTOR,
maxRole: UserRole = UserRole.SYSTEM_ADMIN
): UserRole[] {
return Object.values(UserRole)
.filter(value => typeof value === 'number')
.map(value => value as UserRole)
.filter(role => role >= minRole && role <= maxRole)
.sort((a, b) => a - b)
}
}
// 类型守卫函数
export function isValidUserRole(value: number): value is UserRole {
return Object.values(UserRole).includes(value as UserRole)
}
// 角色权限映射
export const RolePermissions = {
[UserRole.HAZARD_INSPECTOR]: [
'hazard:create',
'hazard:read_own',
'attachment:upload'
],
[UserRole.HAZARD_RECTIFIER]: [
'hazard:read_all',
'task:assign',
'hazard:verify',
'hazard:close',
'report:generate'
],
[UserRole.SECURITY_ADMIN]: [
'user:manage',
'role:assign',
'system:configure',
'dashboard:view'
],
[UserRole.AUDITOR]: [
'log:view_all',
'audit:export',
'compliance:report'
],
[UserRole.SYSTEM_ADMIN]: [
'server:manage',
'backup:execute',
'monitor:view'
]
} as const;
/**
* 检查用户是否有特定权限
* @param userRole 用户角色
* @param permission 权限字符串
* @returns 是否有权限
*/
export function hasPermission(
userRole: UserRole,
permission: string
): boolean {
const permissions = RolePermissions[userRole] || []
return permissions.includes(permission as any)
}
```
## 主要变更说明
1. **角色定义调整**:
```typescript
// 变更前
SECURITY_INSPECTOR = 10, // 安全巡检员
// 变更后
HAZARD_INSPECTOR = 10, // 隐患排查员
HAZARD_RECTIFIER = 15, // 新增隐患治理员
```
2. **角色注释更新**:
- 为每个角色添加详细职责说明
- 明确权限范围和限制
- 保持与后端文档一致
3. **辅助功能增强**:
- 添加 `getLabel()` 获取本地化名称
- 添加 `hasPermission()` 检查角色层级权限
- 添加 `getRolesInRange()` 获取角色范围
## 使用示例
### 1. 获取角色名称
```typescript
const userRole = UserRole.HAZARD_RECTIFIER;
console.log(UserRole.getLabel(userRole)); // 输出: "隐患治理员"
```
### 2. 权限检查
```typescript
// 检查用户是否有权限访问安全管理员功能
const currentUserRole = UserRole.HAZARD_RECTIFIER;
const canAccessAdmin = UserRole.hasPermission(
currentUserRole,
UserRole.SECURITY_ADMIN
); // false
// 检查用户是否是隐患排查员
const isInspector = UserRole.isRole(
currentUserRole,
UserRole.HAZARD_INSPECTOR
); // false
```
### 3. 获取角色范围
```typescript
// 获取所有普通操作角色(排除系统管理员)
const operationalRoles = UserRole.getRolesInRange(
UserRole.HAZARD_INSPECTOR,
UserRole.AUDITOR
);
// [10, 15, 20, 30]
```
### 4. 权限验证
```typescript
// 检查是否可以分配任务
const canAssignTask = hasPermission(
UserRole.HAZARD_RECTIFIER,
'task:assign'
); // true
// 检查是否可以管理用户
const canManageUsers = hasPermission(
UserRole.HAZARD_RECTIFIER,
'user:manage'
); // false
```
### 5. 类型安全使用
```typescript
// 在API响应处理中
api.getUserInfo().then(response => {
const roleValue = response.data.role;
if (isValidUserRole(roleValue)) {
// 类型安全的使用
const userRole: UserRole = roleValue;
// ...
} else {
console.error('无效的用户角色:', roleValue);
}
});
```
## 企业级最佳实践
### 1. 前后端角色同步
- 在项目文档中维护角色定义表
- 使用自动化脚本检查前后端角色一致性
- 每次后端角色变更时更新前端枚举
### 2. 权限控制实现
```typescript
// 在路由守卫中使用
router.beforeEach((to, from, next) => {
const requiredRole = to.meta.requiredRole as UserRole | undefined;
if (requiredRole) {
const userRole = store.state.user.role;
if (!UserRole.hasPermission(userRole, requiredRole)) {
next('/forbidden');
return;
}
}
next();
});
// 在组件中使用
const canCloseHazard = computed(() => {
return hasPermission(userRole.value, 'hazard:close');
});
```
### 3. 角色扩展性设计
```typescript
// 可扩展的角色配置
interface RoleDefinition {
id: UserRole;
name: string;
permissions: string[];
minSubRole?: UserRole; // 可管理的下级角色
}
export const RoleDefinitions: Record<UserRole, RoleDefinition> = {
[UserRole.HAZARD_INSPECTOR]: {
id: UserRole.HAZARD_INSPECTOR,
name: '隐患排查员',
permissions: ['hazard:create', 'hazard:read_own'],
minSubRole: UserRole.HAZARD_INSPECTOR
},
[UserRole.HAZARD_RECTIFIER]: {
id: UserRole.HAZARD_RECTIFIER,
name: '隐患治理员',
permissions: ['hazard:read_all', 'task:assign', 'hazard:close'],
minSubRole: UserRole.HAZARD_INSPECTOR
},
// ...其他角色
};
// 使用示例:获取可分配的角色范围
function getAssignableRoles(managerRole: UserRole): UserRole[] {
const { minSubRole } = RoleDefinitions[managerRole];
return UserRole.getRolesInRange(minSubRole, managerRole);
}
```
### 4. 审计日志记录
```typescript
// 在权限变更时记录
function assignUserRole(userId: string, newRole: UserRole) {
const currentUserRole = store.state.user.role;
if (!UserRole.hasPermission(currentUserRole, newRole)) {
throw new Error('无权分配该角色');
}
// 记录审计日志
auditService.log(
AuditAction.ROLE_CHANGE,
`分配角色: ${UserRole.getLabel(newRole)}`,
{ userId, newRole }
);
// 执行分配操作
api.assignUserRole(userId, newRole);
}
```
## 变更影响分析
1. **前端界面调整**:
- 所有显示"安全巡检员"的地方改为"隐患排查员"
- 在用户管理界面添加"隐患治理员"选项
- 更新权限控制逻辑,包含新角色
2. **权限控制更新**:
- 隐患排查相关功能:仅限 `HAZARD_INSPECTOR`
- 隐患治理相关功能:仅限 `HAZARD_RECTIFIER`
- 更新路由守卫和组件权限检查
3. **API请求调整**:
- 用户创建/更新接口支持新角色值
- 角色过滤接口返回新角色列表
4. **测试用例更新**:
- 添加隐患治理员的测试场景
- 验证隐患排查员与治理员的权限分离
- 测试角色层级权限控制
这个更新确保前后端角色定义完全一致,新增的隐患治理员角色完善了安全隐患排查治理的闭环流程,同时保持了系统的安全性和可维护性。