Java SE 的 AccessController + Permission 架構設計於 Applet 時代,核心目標是「程式碼來源可信度」。隨著 Java 進入企業級應用,純粹基於代碼的權限模型暴露出嚴重管理與執行時缺陷,無法滿足細粒度授權 (Fine-Grained Entitlements, FGE) 需求。
SecurityManager.checkPermission(Permission)AccessController 遍歷呼叫堆疊每個 FrameCodeSource (位置/簽名) 與 Principal (JAAS 登入身分) 計算權限集
4. Policy 提供者評估所有 Permission.implies(),任一通過即允許
5. 全堆疊通過 → 返回;否則拋 SecurityException
企業應用常需定義數百~數千自訂 Permission (如 TransferPermission, AccountEditButtonUIPermission...),缺乏分類與階層,難以維護。
每個 Permission 自行解析資源字串:FilePermission 用路徑通配符,SocketPermission 用 host:port。管理工具無法統一解析、建立資源拓撲。
權限類封裝評估邏輯,外部審計工具需知曉所有可能 Permission 實作才能回答「誰能做什麼」,每版應用釋出皆需更新審計工具。
checkPermission 仍遍歷全堆疊AccessController 演算法不可替換,無法外部化 PDP (Policy Decision Point)Java 模型僅解決「能否執行動作」,無法表達「能看見哪些資料列」。雙模型 (功能 + 資料) 維護成本高、易不一致;單純攔截存取則暴露過多資訊、使用者體驗差。
| 方案 | 優點 | 缺點/現狀 |
|---|---|---|
| XACML 標準 | 定義統一術語 (PAP/PDP/PEP/PIP)、策略語言、請求/回應協定 | 僅為標準,無 Java Binding;Sun 早期計劃 J2SE Policy Profile 長期停滯 |
| 廠商 XACML 產品 | 提供 Java API、管理主控台、效能優化、ABAC 支援 | 廠商鎖定、授權成本高 |
| JSR 115 (JACC) | 修補 EE/SE 權限整合 | 仍建立在 SE Permission 模型上,未解決 FGE 需求;業界採用極低 |
| 自研授權框架 | 完全掌控、貼合業務 | 開發維護成本極高、易重複造輪子 |
Java SE 權限模型歷史使命已畢,企業級授權需轉向基於 XACML 的專業化方案。本文不盡列舉所有缺陷,旨在提供決策參考框架。