• 沒有找到結果。

脅 [2]。一般普遍認為,方便的資訊科技例如 Google, Facebook 的流行,是讓現在人 失去隱私的主要原因之一,不過水能載舟亦能覆舟,資訊科技也可以促成更健全的隱

式語言。還會介紹 Wicket/Hibernate/Spring 等 Java 界常用的技術框架。第 3 章是該系 統框架的架構與設計。第 4 章是解釋如何實作此系統框架,重點在實作的細節以及設計

在 “Modelling Access Control for a Complex Healthcare Organization” [25] 中,作者改進 了常用的 RBAC (Role-Based Access Control) 機制,但是並未將目的列入存取控管考慮 的因素之中;此外,該研究從系統建立初期就進行存取控管機制設計,而本論文希望 能在無需大幅度改寫的前提下改進現行系統的方向,相比之下會更加有彈性。而在

“Authorisation and access control for electronic health record systems” [24],該研究著重於 如何將 System Modeling 的方法論 (methodologies) 應用到權限存取控管機制裡,和本 論文較為偏重系統實作的方向也不盡相同。

2.1.1 XACML

XACML 是 eXtensible Access Control Markup Language 的 縮 寫 , 是 以 Security Assertion Markup Language (SAML, 安全宣示標示語言) 為基礎延伸發展,以 XML 實 作的宣告式權限控管政策的語言 (declarative access control policy language)。最新的 XACML 2.0 在 2005 年 2 月成為 oasis (Organization for the Advancement of Structured Information Standards) [7] 標準。

使用 XACML 有下列幾項好處 [8]:

 是業界標準,不需要再自己重新打造類似的解決方案,省時省力,而且提供跨

 政策管理點(Policy administration point, PAP):建立單一政策(policy)或政策集合 (policy set) 的系統實體

 政策執行點(Policy enforcement point, PEP):依照既定的授權決策來執行存取控 制的系統實體 (即接收對授權的請求。PEP 向 PDP 發送 XACML 請求,然後根據 PDP 的決策行動)

 政策決策點(Policy decision point, PDP):PDP 使用從 PAP 獲得的策略以及從 PIP 獲得的訊息來進行決策的系統實體

 政策資訊點(Policy information point, PIP):PIP 可提供被存取資源的屬性,以及 試圖存取該資源的實體 (身份證明)

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

XACML 的 Data Flow 如圖 2-1 所示:

圖 2-1: Data Flow of XACML [5]

Data Flow 說明如下:

1. PAP 建立授權單一政策(policy)或政策集合(policy set) 讓 PDP 可以使用,這些授 權政策代表了對特定目標(target) 的管理方式

2. 存取請求者 (例如應用程式) 送出存取請求到 PEP

3. PEP 將收到的存取請求,依原有請求格式送出給 context handler,包含 subjects,

8. Context handler 送出包含目標的決策請求 (decision request) 到 PDP,PDP 依據 申請的政策從 context handler 取得需要的屬性值,然後評估是否要授權

9. PDP 回傳授權評估結果到 Context handler

10. Context handler 將收到的 XACML 格式的回覆轉換成原先請求的格式之後再傳到 PEP

11. PEP 依收到的內容執行「責任 (obligations)」 (即允許請求者存取資源與否) 12. (未出現在流程圖中) 如果該訊息的授權評估結果為允許,則允許請求者做資源

存取,否則中斷存取動作

舉例來說,當有使用者試圖存取檔案系統上的一份文件時,就會發出一個請求到保護 該文件的裝置 (可能是一台伺服器),也就是政策執行點 (Policy Enforcement Point, PEP)。政策執行點會根據請求者的身份、請求的文件類型、動作以及附加訊息來建立 一個請求 (request),然後政策執行點會將該請求發送到政策決策點 (Policy Decision Point, PDP ) 去。PDP 會評估該請求以及一些相關的存取控管政策,並回覆該要求是否

EPAL (Enterprise Privacy Authorization Language) 是 IBM 開發的「企業隱私授權語 言」,是用來撰寫企業內隱私權政策的正式語言,讓資訊部門可以根據細緻的正反面授

4. 每個規則可以指定責任 (obligations),表示如果該行動執行的話,該責任也必須 被執行

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

2.2 AOP/AspectJ技術介紹

在企業應用程式 (Enterprise Application) 中,除了必須的業務面功能需求之外,通常還 會有權限控管 (access control )、交易控制 (transaction) 與記錄檔 (log) 等非功能性的 需求。這類需求有一個共通的特點,就是在應用程式內的各個模組之中都會用到,改 一個程式碼就要到各模組修改,不容易集中維護。在軟體開發的文獻中,通常稱這類 需求為應用程式的橫跨性關注 (Crosscutting concerns) [11]。現今應用廣泛的物件導向 程式設計 (Object-oriented programming) 對這類問題無法提供有效的封裝與模組化支 援,使得實現此類需求的程式碼必須重複出現於各個功能模組中,與其他程式碼糾結 在一起;雖然物件導向程式設計可以將相同的程式碼放到同個類別 (class) 中開發維 護,但是使用的時候還是要手動呼叫該類別中的函數才行。舉例來說,下面的程式碼 摘錄自 Java SE 6 標準函式庫的 java.io.File (http://download.java.net/openjdk/jdk6/),呼 叫 Java 安全服務 (System.getSecurityManager()) 的相同程式碼(圖 2-2 紅色框線部份)總 共有 24 次:

圖 2-2 java.io.File

上述正是剖面導向程式設計 (Aspect Oriented Programming, AOP) [12] 試圖要解決的的 問題。剖面導向程式設計的目的是將橫跨性關注予以模組化,例如權限控管 (access control )、交易控制 (transaction) 與記錄檔 (log) 這些遍佈應用系統,但是和系統核心 需求較不相關的功能。在剖面導向程式設計 (AOP) 中,一個程式包含了許多功能模組 (基本程式) 和一些封裝橫跨性關注 (crosscutting concerns)的剖面 (Aspects)。一個剖面 (Aspect) 模組提供了三種規格,以便實現基本程式中的橫跨性關注。第一個是切入點 (pointcut),切入點會選擇一套在程式執行中明確定義的連接點 (join points),指定在哪 個位置橫切到其他模組。第二個是意見 (advice),是當切入點遇到任何連接點時會執行 的一段程式碼。第三個是類型之間的宣告 (inter-type declarations),定義在基本程式中 的靜態類別階層上操作的橫跨性關注。圖 2-3 顯示 AOP 如何在應用程式中整合不同 模組:

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

圖 2-3 以剖面導向程式設計整合企業應用程式中的不同模組 [13]

基本上,剖面導向程式設計中所謂的織入 (weaving) 就是根據剖面 (Aspects) 中定義 的規格,組合功能模組和剖面來產生完整的程式。這樣一來,當剖面 (Aspects) 中的 規格有修改的時候,織入 (weaving) 會讓功能模組也做出相對應的修改。

AspectJ [14] 是和 Java 程式語言整合良好的一個剖面導向擴充。AspctJ 利用功能強大 的連接點 (jointpoint) 模型提供了一個切入點 (pointcut) 語言。在 AspectJ 中常用的連 接點是方法 (method)、建構子 (constructor) 的執行以及存取欄位 (field) 等等。切入 點 (pointcut) 前後的資訊稱為 thisJointPoint,我們可以透過切入點 (pointcut) 將這些 資訊傳遞到意見 (advice) 中。意見 (advice) 是 AspectJ 中的一個匿名方法 (anonymous method),和切入點連結在一起,並標記下列三個關鍵字其中之一:before, after 或 around。顧名思義,before 表示在連接點(join points) 之前、after 是在連接點 (join points) 之後執行,around 比較特別,在 around advice 內,我們可以藉著呼叫內建的

‧ 國

立 政 治 大 學

N a tio na

l C h engchi U ni ve rs it y

proceed() 繼續執行該方法,或是乾脆不執行。在 AspectJ 中,織入 (weaving) 的工具 和 AspectJ 的編譯器 ajc 整合在一起,所以把剖面 (Aspects) 編譯成 bytecode 的時候 就一併執行織入 (weaving) [15]。

此外,AspectJ 的類型之間的宣告 (inter-type declarations) 允許程式設計師新增需要的 方法 (method) 和欄位 (field),並且把這些新增的方法和欄位跟現有程式連結起來,因 此不需要修改現有程式就可以擴充該程式的功能。AspectJ 也允許提供一個有抽象切入 點 (Abstract pointcuts) 和抽象方法的抽象剖面 (Abstract aspects) 讓子剖面 (sub-aspect) 繼承,然後在子剖面中撰寫實作的切入點 (pointcut) 和方法。這種可以建立泛用剖面 (generic aspect) 的功能對應用框架來說很重要。

2.3 Spring/Hibernate/Wicket 技術介紹

本論文在實作網頁應用程式的時候,廣泛應用了 Spring (http://www.springsource.org/), Hibernate (http://www.hibernate.org/) 和 Wicket (http://wicket.apache.org/) 等幾個 Java 界常見的開放原始碼 (open source) 框架 (framework),在這一章節將會針對各框架進 行概略的介紹。

2.3.1 Spring

Spring 是由 Rod Johnson 開發,一個分層式 (layered) 的 Java/J2EE (Java 2 Platform, Enterprise Edition, http://java.sun.com/j2ee/overview.html) 應 用 程 式 平 台 (application platform),Rod Johnson 會想建立 Spring 的原因是當時要開發 EJB 2.x (Enterprise JavaBeans, http://www.oracle.com/technetwork/java/index-jsp-140203.html) 應用程式不但 繁瑣,而且需要搭配笨重(通常也不便宜)的應用伺服器 (Application Server),像是 Websphere, Weblogic 等,因此 Spring 就是希望能減輕軟體工程師開發企業應用程式 的負擔。Spring 包含了下列功能:

 輕量級的容器 (lightweight container): 針對應用程式中的物件提供了集中而且自 動化管理的機制。該容器並不具有擴散性 (non-invasive),能把一群鬆散藕合的 Plain Old Java Object (POJO) [16] 以一致且透明的機制組合,進而構成複雜的企 業應用系統。

 交 易 管 理 (transaction management): 允 許 可 以 置 換 交 易 管 理 員 (transaction managers),而且 Spring 的好處是並不會限制必須使用特定 J2EE 環境才能支 援交易管理機制。

 JDBC (Java Database Connectivity, http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136101.html) 抽象層:

 與 ORM (Object-relational mapping) [17] 整合: Spring 可以和大多數常用的

ORM 解 決 方 案 整 合 , 例 如 Toplink

(http://www.oracle.com/technetwork/middleware/toplink/overview/index.html),

Hibernate, JDO (http://www.oracle.com/technetwork/java/index-jsp-135919.html) 和 MyBatis (http://www.mybatis.org/),不需要擔心用了 Spring 之後不能採用習慣的 ORM 框架。

 支援 AOP (Aspect Oriented Programming) 功能: Spring 對 AOP 有完整的支 援 , Spring 的 AOP 會 實 作 AOP Alliance (http://www.sourceforge.net/projects/aopalliance ) 所規範的介面,AOP Alliance 是 由許多團體所組成的聯合計畫 (Joint project),對於 AOP 的實作會要求必須遵 守所制訂的介面規範,目的是希望讓 Java 的 AOP 實作介面標準化,以達到 AOP 實作在不同的 Java 應用程式之間的可移植性 (portability)。

 彈性的 MVC (Model–View–Controller) [18] 網頁應用程式框架 (web application framework): Spring 本身提供了一套完整、容易客制化的 (configurable) MVC 網頁應用程式框架,但是 Spring 也支援其他常見的網頁應用程式框架,像是 Struts (http://struts.apache.org/ ), Tapestry (http://tapestry.apache.org/), Wicket 或是 GWT (http://code.google.com/webtoolkit/ )。

2.3.2 Hibernate

Hibernate 是「物件/關聯對應」 (Object-relational mapping, ORM) 的解決方案,簡單的 說 就 是 將 Java 中的物件與物件關係,對應到關聯式資料庫 (Relational Database, RDBMS) [19] 中的資料表 (Table) 與資料表之間的關係,而 Hibernate 提供了自動轉 換的功能。

也就是所謂「物件/關聯式本質不相配」 (Object-Relational Impedance Mismatch) [20] 問 題,造成軟體工程師花許多時間處理物件和資料表之間不同格式的資料轉換。ORM 正

(polymorphism)、組合 (composition) 和 Java Collection Framework,因此軟體工 程師在 Java 中所有物件之間的關係都可以完整跟關聯式資料庫中的資料表相對 應。

 透明的永續儲存: Hibernate 並不要求 Java 物件繼承 Base Class 或是實作某些 介 面 (Interface) 才 能 夠 被 對 應 到 資 料 表 , 這 樣 對 只 支 援 單 一 繼 承 (Single Inheritance) 的 Java 來說是比較有彈性的作法。

 更好的效能: Hibernate 預設會使用延遲初始 (lazy initialization) 機制,也就是物 件只有在使用到的時候才會載入到記憶體中,這樣可以增進效能以及減少記憶 體的使用。

 可靠性和延伸性: Hibernate 的設計就是能在伺服器叢集 (application server cluster) 中使用,因此具備了高度的延伸性。

 可擴充性: Hibernate 很容易就能客制化和擴充功能。

 完整的查詢語言: Hibernate 總共支援 Hibernate Query Language (HQL), Java Persistence Query Language (JPAQL), Criteria queries, 和原生的 (native) "SQL"

等各種查詢語言。

2.3.3 Wicket

Java 界的網頁應用程式框架有數十個之多,主要分成兩大類,一種是 Request based,

共同的地方是 API 主要以剖析 HTTP Request 和產生 HTTP Response 為主,Struts 和 Spring MVC 是主要的代表;另外一種是 Component based [22],比較普遍的有

JSF (Java Server Faces, http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html), Tapestry 和這

邊要介紹的 Wicket。

Wicket 是 Apache 基 金 會 (http://www.apache.org/) 下 的 一 個 專 案 , 是 個 輕 量 級 的 Component based 網頁應用程式框架,特色是把開發網頁應用程式抽象化,轉變成類 似撰寫 Java Swing (http://download.oracle.com/javase/tutorial/uiswing/) 應用程式,透過 建立元件 (Components) 來構成網頁,Wicket 有下列優點:

 徹底的物件導向: 在 Wicket 裡面,所有東西都是物件,頁面 (Page) 是物件,

頁面上的每個元件像是按鈕 (Button)、下拉式選單 (Drop-down choice) 等也都 是物件,好處是程式共用會很方便,只要把重複的程式碼寫在一個元件裡面,

頁面上的每個元件像是按鈕 (Button)、下拉式選單 (Drop-down choice) 等也都 是物件,好處是程式共用會很方便,只要把重複的程式碼寫在一個元件裡面,

相關文件