处方流转平台权限控制模块设计(基于RBAC模型)

这是基于笔者的一些经验设计并加以完善的方案,仅供参考。

处方流转平台权限控制模块设计(基于RBAC模型)

1. 需求分析

处方流转平台需要严格的权限控制,确保:

  • 患者隐私数据保护
  • 处方开具、审核、调配、发药等流程的合规性
  • 不同角色(医生、药师、管理员等)的操作权限隔离
  • 符合医疗行业法规要求(如HIPAA、GDPR等)

2. RBAC模型设计

2.1 核心组件

用户(User) ← 用户-角色关联 → 角色(Role) ← 角色-权限关联 → 权限(Permission)

2.2 数据库设计

-- 用户表
CREATE TABLE users (user_id VARCHAR(36) PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password_hash VARCHAR(255) NOT NULL,real_name VARCHAR(100),department_id VARCHAR(36),is_active BOOLEAN DEFAULT TRUE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);-- 角色表
CREATE TABLE roles (role_id VARCHAR(36) PRIMARY KEY,role_name VARCHAR(50) NOT NULL UNIQUE,description TEXT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);-- 权限表
CREATE TABLE permissions (permission_id VARCHAR(36) PRIMARY KEY,permission_code VARCHAR(100) NOT NULL UNIQUE,permission_name VARCHAR(100) NOT NULL,resource_type VARCHAR(50) NOT NULL,  -- 如"处方"、"患者"、"药品"等action VARCHAR(50) NOT NULL,         -- 如"create","read","update","delete"description TEXT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);-- 用户-角色关联表
CREATE TABLE user_roles (user_id VARCHAR(36) NOT NULL,role_id VARCHAR(36) NOT NULL,PRIMARY KEY (user_id, role_id),FOREIGN KEY (user_id) REFERENCES users(user_id),FOREIGN KEY (role_id) REFERENCES roles(role_id)
);-- 角色-权限关联表
CREATE TABLE role_permissions (role_id VARCHAR(36) NOT NULL,permission_id VARCHAR(36) NOT NULL,PRIMARY KEY (role_id, permission_id),FOREIGN KEY (role_id) REFERENCES roles(role_id),FOREIGN KEY (permission_id) REFERENCES permissions(permission_id)
);

2.3 典型角色定义

  1. 医生(Doctor)

    • 权限:处方创建、修改(限未审核状态)、查看本人开具处方
    • 特殊约束:只能开具所属科室的药品
  2. 药师(Pharmacist)

    • 权限:处方审核、调配、发药、查看所有处方
    • 特殊约束:调配需双人审核
  3. 药房管理员(PharmacyAdmin)

    • 权限:药品库存管理、处方统计查看
    • 特殊约束:无药品调配权限
  4. 系统管理员(SystemAdmin)

    • 权限:用户管理、角色管理、权限配置
    • 特殊约束:无医疗业务操作权限
  5. 患者(Patient)

    • 权限:查看本人处方、处方流转状态查询
    • 特殊约束:仅能访问本人数据

3. 权限控制实现

3.1 权限验证流程

1. 用户登录 → 获取JWT令牌(包含用户ID和角色)
2. 每次API请求携带JWT
3. 权限拦截器:a. 解析JWT获取用户角色b. 查询角色对应的权限集c. 验证当前请求资源+操作是否在权限集中
4. 通过 → 继续处理; 拒绝 → 返回403

3.2 代码实现示例(Java Spring Boot)

// 自定义权限注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiredPermission {String resource();String action();
}// 权限拦截器
@Component
public class PermissionInterceptor implements HandlerInterceptor {@Autowiredprivate PermissionService permissionService;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 1. 获取当前用户角色Authentication auth = SecurityContextHolder.getContext().getAuthentication();String roleId = auth.getPrincipal().getRoleId();// 2. 获取请求资源和方法HandlerMethod handlerMethod = (HandlerMethod) handler;Method method = handlerMethod.getMethod();String requestUri = request.getRequestURI();// 3. 检查方法级权限注解if (method.isAnnotationPresent(RequiredPermission.class)) {RequiredPermission permission = method.getAnnotation(RequiredPermission.class);if (!permissionService.checkPermission(roleId, permission.resource(), permission.action())) {throw new AccessDeniedException("权限不足");}}// 4. 额外业务规则检查(如数据归属)checkDataOwnership(auth, request);return true;}private void checkDataOwnership(Authentication auth, HttpServletRequest request) {// 示例:验证患者只能访问自己的处方if (request.getRequestURI().startsWith("/api/prescriptions") && "PATIENT".equals(auth.getRole())) {String prescriptionId = request.getParameter("id");if (!prescriptionService.isOwnedByPatient(prescriptionId, auth.getUserId())) {throw new AccessDeniedException("无权访问该资源");}}}
}

3.3 权限服务实现

@Service
public class PermissionServiceImpl implements PermissionService {@Autowiredprivate RolePermissionMapper rolePermissionMapper;@Overridepublic boolean checkPermission(String roleId, String resource, String action) {// 1. 查询角色所有权限List<Permission> permissions = rolePermissionMapper.findByRoleId(roleId);// 2. 检查是否包含所需权限return permissions.stream().anyMatch(p -> p.getResourceType().equals(resource) && p.getAction().equals(action));}@Overridepublic Set<String> getUserPermissions(String userId) {// 获取用户所有权限(用于前端动态菜单)return rolePermissionMapper.findPermissionsByUserId(userId).stream().map(p -> p.getResourceType() + ":" + p.getAction()).collect(Collectors.toSet());}
}

4. 高级功能设计

4.1 动态权限管理

  • 提供管理界面进行角色权限配置
  • 权限变更实时生效(通过权限缓存刷新机制)
  • 权限变更审计日志

4.2 数据级权限控制

除常规RBAC外,增加数据过滤规则:

// 在数据访问层自动添加过滤条件
@Repository
public class PrescriptionRepositoryImpl implements PrescriptionRepositoryCustom {@Autowiredprivate SecurityContext securityContext;@Overridepublic List<Prescription> findAccessiblePrescriptions() {CriteriaBuilder cb = entityManager.getCriteriaBuilder();CriteriaQuery<Prescription> query = cb.createQuery(Prescription.class);Root<Prescription> root = query.from(Prescription.class);// 根据用户角色添加不同过滤条件if (securityContext.isDoctor()) {query.where(cb.equal(root.get("creatorId"), securityContext.getUserId()));} else if (securityContext.isPharmacist()) {// 药师可查看所有处方} else if (securityContext.isPatient()) {query.where(cb.equal(root.get("patientId"), securityContext.getUserId()));}return entityManager.createQuery(query).getResultList();}
}

4.3 权限继承与组合

  • 支持角色继承(子角色继承父角色所有权限)
  • 支持权限组(将常用权限组合打包)

5. 安全增强措施

  1. 权限变更审计:记录所有权限配置变更
  2. 定期权限复核:强制要求定期检查用户权限分配
  3. 敏感操作二次认证:如处方删除需短信验证
  4. 最小权限原则:新用户默认无权限,需显式分配
  5. 会话管理:支持强制下线、会话超时

6. 性能优化

  1. 权限缓存:使用Redis缓存用户权限集,设置合理过期时间
  2. 批量检查:对批量操作进行优化,避免N+1查询问题
  3. 权限索引:确保权限相关查询字段有适当索引

总结

处方流转平台的权限控制模块设计应:

  1. 严格遵循RBAC模型,实现角色与权限的解耦
  2. 结合医疗行业特点,设计符合法规要求的权限规则
  3. 实现方法级和数据级的双重权限控制
  4. 提供灵活的权限管理界面供管理员使用
  5. 确保系统性能的同时不降低安全性

这种设计可以满足处方流转平台复杂的权限控制需求,同时保持系统的可维护性和扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/903937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于BM1684X+RK3588的智能工业视觉边缘计算盒子解决方案

智能工业视觉边缘计算终端技术方案书‌ ‌1. 产品概述‌ 1.1 产品定位 面向工业自动化场景的高性能AI视觉处理设备集成BM1684X&#xff08;8TOPS INT8&#xff09;AI加速芯片 RK3588&#xff08;6TOPS NPU&#xff09;异构计算支持工业级多相机接入、实时缺陷检测、高精度定…

软件工程中的 QFD

: 软件工程中的 QFD 在软件工程领域,随着市场竞争的加剧和用户需求的日益复杂,如何有效地将用户需求转化为软件产品,成为软件开发团队面临的重要挑战。而质量功能部署(Quality Function Deployment,QFD)作为一种强大的工具,为这一问题提供了有效的解决方案。 一、QF…

Vue2基础速成

一、准备工作 首先下载vue2的JavaScript库&#xff0c;并且命名为vue.min.js 下载链接&#xff1a;https://cdn.jsdelivr.net/npm/vue2&#xff08;若链接失效可去vue官网寻找&#xff09; CTRLS即可下载保存 文件目录结构 二、使用操作原生DOM与使用VUE操作DOM的便捷性比较…

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(14):かもしれません (~た・~ない)ほうがいいです

日语学习-日语知识点小记-构建基础-JLPT-N4阶段&#xff08;1&#xff14;&#xff09;&#xff1a;かもしれません &&#xff08;&#xff5e;た・&#xff5e;ない&#xff09;ほうがいいです 1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师…

传统银行服务和 区块链支付无缝融合的一种解决方案

Dragonfly Capital 的合伙人 Alex Pack 曾表示:“DeFi 的目标是重构全球银行体系,并打造开放且无须许可的经营环境。”在 DeFi 的金融世界中,加密资产架构在区块链上,通过各个协议实现资产之间的高效转移和价值的实时流通,如 Metamask 钱包的自托管,Uniswap 的资产交易,…

基于深度学习的毒蘑菇检测

文章目录 任务介绍数据概览数据处理数据读取与拼接字符数据转化标签数据映射数据集划分数据标准化 模型构建与训练模型构建数据批处理模型训练 文件提交结果附录 任务介绍 本次任务为毒蘑菇的二元分类&#xff0c;任务本身并不复杂&#xff0c;适合初学者&#xff0c;主要亮点…

时间给了我们什么?

时间给了我们什么&#xff1f; ​春秋易逝&#xff0c;青春难留&#xff0c;转瞬之间已过半百。 ​过往中&#xff0c;有得有失&#xff0c;这就是人生。 ​一日三餐四季&#xff0c;日起日落里&#xff0c;成就了昨天、今天和明天&#xff0c;在历史长河中&#xff0c;皆是…

软件工程国考

软件工程-同等学力计算机综合真题及答案 &#xff08;2004-2014、2017-2024&#xff09; 2004 年软工 第三部分 软件工程 &#xff08;共 30 分&#xff09; 一、单项选择题&#xff08;每小题 1 分&#xff0c;共 5 分&#xff09; 软件可用性是指&#xff08; &#xff09…

数据结构*栈

栈 什么是栈 这里的栈与我们之前常说的栈是不同的。之前我们说的栈是内存栈&#xff0c;它是JVM内存的一部分&#xff0c;用于存储局部变量、方法调用信息等。每个线程都有自己独立的栈空间&#xff0c;当线程启动时&#xff0c;栈就会被创建&#xff1b;线程结束&#xff0c…

IntelliJ IDEA 保姆级使用教程

文章目录 一、创建项目二、创建模块三、创建包四、创建类五、编写代码六、运行代码注意 七、IDEA 常见设置1、主题2、字体3、背景色 八、IDEA 常用快捷键九、IDEA 常见操作9.1、类操作9.1.1、删除类文件9.1.2、修改类名称注意 9.2、模块操作9.2.1、修改模块名快速查看 9.2.2、导…

HTTP 快速解析

一、HTTP请求结构 HTTP请求和响应报文由以下部分组成&#xff08;以请求报文为例&#xff09;&#xff1a; 请求报文结构&#xff1a; 请求行&#xff1a;包含HTTP方法&#xff08;如GET/POST&#xff09;、请求URL和协议版本&#xff08;如HTTP/1.1&#xff0c;HTTP/2.0&…

【AI学习】李宏毅新课《DeepSeek-R1 这类大语言模型是如何进行「深度思考」(Reasoning)的?》的部分纪要

针对推理模型&#xff0c;主要讲了四种方法&#xff0c;两种不需要训练模型&#xff0c;两种需要。 对于reason和inference&#xff0c;这两个词有不同的含义&#xff01; 推理时计算不是新鲜事&#xff0c;AlphaGo就是如此。 这张图片说明了将训练和推理时计算综合考虑的关系&…

Kotlin Flow流

一 Kotlin Flow 中的 stateIn 和 shareIn 一、简单比喻理解 想象一个水龙头&#xff08;数据源&#xff09;和几个水杯&#xff08;数据接收者&#xff09;&#xff1a; 普通 Flow&#xff08;冷流&#xff09;&#xff1a;每个水杯来接水时&#xff0c;都要重新打开水龙头从…

【嵌入式Linux】基于ARM-Linux的zero2平台的智慧楼宇管理系统项目

目录 1. 需求及项目准备&#xff08;此项目对于虚拟机和香橙派的配置基于上一个垃圾分类项目&#xff0c;如初次开发&#xff0c;两个平台的环境变量&#xff0c;阿里云接入&#xff0c;摄像头配置可参考垃圾分类项目&#xff09;1.1 系统框图1.2 硬件接线1.3 语音模块配置1.4 …

Linux运维中常用的磁盘监控方式

在Linux运维中&#xff0c;磁盘监控是一项关键任务&#xff0c;因为它能帮助我们预防磁盘空间不足或性能问题导致的服务中断或数据丢失。让我们来看看有哪些常用的磁盘监控方法吧&#xff01; 1. 查看磁盘使用情况&#xff08;df命令&#xff09; df命令用于显示文件系统的…

OpenCV第6课 图像处理之几何变换(缩放)

1.简述 图像几何变换又称为图像空间变换,它将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置。几何变换并不改变图像的像素值,只是在图像平面上进行像素的重新安排。 根据OpenCV函数的不同,本节课将映射关系划分为缩放、翻转、仿射变换、透视等。 2.缩放 2.1 函数…

(35)VTK C++开发示例 ---将图片映射到平面2

文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;VTK开发 &#x1f448; 1. 概述 与上一个示例不同的是&#xff0c;使用vtkImageReader2Factory根据文件扩展名或内容自动创建对应的图像文件读取器&a…

【模型量化】量化基础

目录 一、认识量化 二、量化基础原理 2.1 对称量化和非对称量化 2.1.1 对称量化 2.1.2 非对称量化 2.1.3 量化后的矩阵乘 2.2 神经网络量化 2.2.1 动态量化 2.2.2 静态量化 2.3 量化感知训练 一、认识量化 量化的主要目的是节约显存、提高计算效率以及加快通信 dee…

【零基础入门】一篇掌握Python中的字典(创建、访问、修改、字典方法)【详细版】

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀《PyTorch科研加速指南:即插即用式模块开发》-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. 字典 2.1 字典的创建 2.1.1 大括号+直接赋值 2.1.2 大括号…

PHP-session

PHP中&#xff0c;session&#xff08;会话&#xff09;是一种在服务器上存储用户数据的方法&#xff0c;这些数据可以在多个页面请求或访问之间保持。Session提供了一种方式来跟踪用户状态&#xff0c;比如登录信息、购物车内容等。当用户首次访问网站时&#xff0c;服务器会创…