一、权限控制目标与原则
1. 目标:实现基于角色、部门、数据范围的精细化权限管理,确保数据安全与操作合规
2. 原则:
- 最小权限原则:用户仅拥有完成工作所需的最小权限
- 职责分离原则:关键操作需多人协作完成
- 动态调整原则:权限随岗位变动实时调整
- 审计追溯原则:所有权限变更可追溯
二、权限控制维度设计
1. 功能权限(菜单/按钮级)
- 采购模块:
- 采购申请(创建/提交/撤回)
- 供应商管理(查看/编辑/禁用)
- 价格谈判(发起/参与/确认)
- 库存模块:
- 入库操作(扫码入库/手动入库)
- 出库审批(普通出库/紧急出库)
- 盘点管理(发起/执行/差异处理)
- 财务模块:
- 付款申请(创建/提交/作废)
- 对账管理(自动对账/手动调整)
- 发票处理(上传/核销/作废)
2. 数据权限(行级控制)
- 按区域划分:
- 仓库数据(仅可见管辖仓库)
- 配送路线(仅可见负责区域)
- 客户数据(仅可见服务客户)
- 按业务线划分:
- 生鲜品类(蔬菜/肉类/水产独立权限)
- 订单类型(B2B/B2C/团购权限隔离)
- 价格体系(采购价/销售价/成本价分级)
3. 字段级权限
- 敏感字段控制:
- 供应商联系方式(仅采购主管可见)
- 成本价(仅财务/高层可见)
- 员工薪资(HR专属权限)
三、角色体系设计
1. 基础角色库
| 角色类型 | 功能权限示例 | 数据权限示例 |
|----------------|---------------------------------------|----------------------------------|
| 仓库管理员 | 入库操作、库存查询、盘点执行 | 仅可见所属仓库数据 |
| 采购专员 | 采购申请、供应商查询、比价 | 仅可见负责品类供应商 |
| 财务审核员 | 付款审批、发票核销、对账确认 | 仅可见关联业务单据 |
| 区域经理 | 区域数据看板、下属权限分配 | 仅可见管辖区域数据 |
| 系统管理员 | 权限配置、日志审计、基础数据维护 | 全系统数据(受审计约束) |
2. 角色继承关系
```
系统管理员
├─ 财务权限组
│ ├─ 财务主管
│ └─ 会计
├─ 采购权限组
│ ├─ 采购经理
│ └─ 采购专员
└─ 仓储权限组
├─ 仓库主管
└─ 仓库管理员
```
3. 动态角色扩展
- 临时权限:通过审批流程授予短期权限(如跨部门协作)
- 组合角色:支持多角色叠加(如"采购专员+财务审核")
- 自定义角色:允许企业根据业务需求创建特定角色
四、技术实现方案
1. 权限模型设计
采用RBAC(基于角色的访问控制)扩展模型:
```
用户(User) → 角色(Role) → 权限(Permission)
↑
数据范围(Scope)
```
2. 数据库设计
```sql
-- 权限表
CREATE TABLE sys_permission (
id BIGINT PRIMARY KEY,
code VARCHAR(64) NOT NULL COMMENT 权限标识,
name VARCHAR(128) NOT NULL COMMENT 权限名称,
type TINYINT NOT NULL COMMENT 1:菜单 2:按钮 3:数据 4:字段,
parent_id BIGINT COMMENT 父权限ID,
url VARCHAR(255) COMMENT 菜单URL,
icon VARCHAR(64) COMMENT 菜单图标,
sort INT COMMENT 排序
);
-- 角色权限关联表
CREATE TABLE sys_role_permission (
role_id BIGINT NOT NULL,
permission_id BIGINT NOT NULL,
data_scope VARCHAR(32) COMMENT 数据范围(ALL/SELF/DEPT等),
PRIMARY KEY (role_id, permission_id)
);
-- 用户角色关联表
CREATE TABLE sys_user_role (
user_id BIGINT NOT NULL,
role_id BIGINT NOT NULL,
PRIMARY KEY (user_id, role_id)
);
```
3. 核心接口设计
```java
// 权限校验接口
public interface PermissionService {
// 检查功能权限
boolean checkPermission(Long userId, String permissionCode);
// 检查数据权限
List filterDataByPermission(Long userId, String permissionCode, List dataList);
// 获取用户可见菜单
List getUserMenus(Long userId);
// 动态权限分配
void assignPermission(Long roleId, Long permissionId, String dataScope);
}
// 数据权限过滤器实现示例
public class DataPermissionInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 从请求中获取用户ID和权限码
Long userId = getUserIdFromRequest(request);
String permissionCode = request.getParameter("permissionCode");
// 执行数据过滤
List<?> dataList = (List<?>) request.getAttribute("dataList");
if (dataList != null) {
List<?> filteredData = permissionService.filterDataByPermission(userId, permissionCode, dataList);
request.setAttribute("dataList", filteredData);
}
return true;
}
}
```
4. 前端控制实现
- 菜单动态渲染:根据后端返回的权限码动态生成菜单
- 按钮级控制:通过v-if或v-show控制按钮显示
- 数据表格过滤:前端请求时携带权限参数,后端返回过滤后数据
五、安全增强措施
1. 权限变更审计:
- 记录所有权限分配、修改、撤销操作
- 包含操作人、操作时间、变更前后权限对比
2. 权限冲突检测:
- 禁止授予相互排斥的权限组合
- 检测角色继承导致的权限叠加问题
3. 定期权限复核:
- 每月生成权限使用报告
- 季度性权限回收与重新分配
4. 应急权限机制:
- 突发情况下的临时权限授予流程
- 权限自动过期与手动回收双控制
六、实施路线图
1. 第一阶段(2周):
- 完成权限模型设计与数据库搭建
- 实现基础角色管理与功能权限控制
2. 第二阶段(3周):
- 开发数据权限过滤引擎
- 实现部门/区域数据隔离
3. 第三阶段(2周):
- 完成字段级权限控制
- 开发权限审计与报表功能
4. 第四阶段(1周):
- 系统压力测试与安全加固
- 用户培训与文档编写
七、预期效果
1. 实现95%以上业务场景的权限覆盖
2. 权限分配效率提升60%以上
3. 敏感数据泄露风险降低80%
4. 权限审计效率提升100%(从人工抽查到全量可查)
通过此细化方案,快驴生鲜系统将建立起企业级的安全权限管理体系,既能满足生鲜行业复杂的业务权限需求,又能确保系统安全稳定运行。