一、需求分析:明确权限控制目标
1. 业务场景覆盖
- 角色类型:采购员、仓管员、配送员、财务、管理员、供应商、客户等。
- 操作场景:订单处理、库存管理、价格调整、财务结算、数据报表查看等。
- 敏感操作:修改价格、删除订单、导出数据、审批流程等需严格管控。
2. 合规与安全要求
- 符合《数据安全法》《个人信息保护法》等法规,避免数据泄露。
- 操作日志审计,确保可追溯性。
3. 用户体验平衡
- 权限分配需灵活,避免过度复杂化影响工作效率。
- 支持权限继承与临时授权(如节假日值班权限)。
二、设计原则:RBAC模型扩展
1. 基于角色的访问控制(RBAC)
- 核心角色:按业务职能划分(如采购主管、仓库管理员)。
- 权限集合:每个角色关联一组权限(如“查看库存”“修改订单状态”)。
- 用户-角色映射:用户通过分配角色获得权限。
2. 扩展模型
- 数据权限:基于组织架构或区域划分(如“仅查看华东区库存”)。
- 字段级权限:控制对敏感字段的访问(如“隐藏客户联系方式”)。
- 动态权限:根据上下文条件(如时间、地点)临时调整权限。
3. 权限粒度
- 功能级:菜单、按钮、API接口的访问控制。
- 数据级:行级(如仅查看自己负责的订单)、列级(如隐藏成本字段)。
- 操作级:增删改查的细分控制(如允许查看但禁止修改)。
三、权限模型实现
1. 数据库设计
- 用户表:`user(id, name, department_id, ...)`
- 角色表:`role(id, name, description)`
- 权限表:`permission(id, name, type, resource_id, ...)`
- 中间表:
- `user_role(user_id, role_id)`
- `role_permission(role_id, permission_id)`
- 可选:`user_permission(user_id, permission_id)`(临时授权场景)
2. 权限校验逻辑
- 前端控制:菜单/按钮动态渲染(如Vue的`v-if`结合权限接口)。
- 后端校验:
- AOP切面:在Controller方法上添加权限注解(如`@PreAuthorize("hasRole(采购员)")`)。
- 自定义逻辑:复杂场景(如“仅允许修改自己创建的订单”)需编写业务逻辑。
- API网关:在网关层校验权限,拦截非法请求。
3. 敏感操作保护
- 二次验证:修改价格、删除数据等操作需输入密码或短信验证码。
- 操作日志:记录操作者、时间、操作内容,支持审计追溯。
四、关键功能实现细节
1. 权限分配界面
- 可视化配置:通过树形结构展示权限列表,支持勾选分配。
- 批量操作:一键复制角色权限,减少重复配置。
- 权限冲突检测:提示角色间的权限重叠或矛盾。
2. 动态权限加载
- 前端路由守卫:根据权限动态生成可访问菜单。
- 后端权限缓存:使用Redis缓存用户权限,减少数据库查询。
3. 多租户支持
- 租户隔离:不同供应商/客户的数据完全隔离,权限仅限本租户。
- 跨租户权限:支持平台管理员查看所有租户数据(需严格审计)。
4. 权限变更通知
- 实时生效:权限修改后立即生效,无需重新登录(通过WebSocket推送)。
- 消息提醒:通知用户权限变更(如“您已被授予查看财务报表权限”)。
五、优化与扩展方向
1. 权限自动化
- 基于规则的权限推荐:根据用户岗位自动推荐默认权限。
- 权限回收机制:离职员工权限自动冻结,避免遗留风险。
2. 权限分析工具
- 权限图谱:可视化展示角色-权限-用户的关系链。
- 冗余权限检测:识别长期未使用的权限,提示管理员清理。
3. 与第三方系统集成
- 单点登录(SSO):对接企业微信、钉钉等,统一身份认证。
- LDAP同步:从企业目录同步用户信息,减少手动维护。
4. 性能优化
- 权限查询优化:对高频查询的权限字段建立索引。
- 分布式锁:避免并发修改权限导致数据不一致。
六、示例代码(Spring Security + JWT)
```java
// 自定义权限注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PreAuthorizePermission {
String[] value(); // 权限标识,如"order:edit"
}
// 权限校验切面
@Aspect
@Component
public class PermissionAspect {
@Autowired
private UserDetailsService userDetailsService;
@Around("@annotation(preAuthorizePermission)")
public Object checkPermission(ProceedingJoinPoint joinPoint, PreAuthorizePermission preAuthorizePermission) throws Throwable {
// 从JWT中获取当前用户权限
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
UserDetails userDetails = (UserDetails) authentication.getPrincipal();
Set permissions = userDetails.getAuthorities().stream()
.map(GrantedAuthority::getAuthority)
.collect(Collectors.toSet());
// 检查是否包含所需权限
for (String requiredPermission : preAuthorizePermission.value()) {
if (!permissions.contains(requiredPermission)) {
throw new AccessDeniedException("无权限操作");
}
}
return joinPoint.proceed();
}
}
// 在Controller中使用
@RestController
@RequestMapping("/orders")
public class OrderController {
@PreAuthorizePermission({"order:view"})
@GetMapping
public List getOrders() { ... }
@PreAuthorizePermission({"order:edit"})
@PostMapping
public Order updateOrder(@RequestBody Order order) { ... }
}
```
七、总结
快驴生鲜系统的权限控制需兼顾安全性与灵活性,通过RBAC模型扩展、动态权限、数据隔离等技术手段,实现:
1. 最小权限原则:用户仅能访问必要功能。
2. 审计追溯:所有操作可追踪。
3. 高效管理:支持批量授权、权限继承等便捷功能。
最终目标是通过精细化的权限设计,降低内部风险,提升系统可信度,支撑生鲜供应链的高效运转。