處方流轉平臺權限控制模塊設計(基于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.pswp.cn/news/903937.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903937.shtml
英文地址,請注明出處:http://en.pswp.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;服務器會創…