天天看點

Seam中基于ACL的權限控制(1)

Seam架構已經能夠解決大多數web程式開發中會遇到的問題。通過提供一系列基于“最佳實踐”總結出的統一模型,開發人員的web程式的開發工作變得非常輕松。程式員在開發具體的相關業務邏輯的時候,就不會再郁悶了,因為大多數功能在Seam中都有對應的子產品來實作。例如,Seam生成PDF、發送email、實作國際化等,都非常友善。同時,Seam還內建了許多第三方架構,例如Drools、jBPM等,這些架構寫作能夠實作非常複雜的業務邏輯以及跨度時間很長的流程操作。其他還支援自動生成驗證碼、wiki風格的标記語言和一大堆AJAX功能。

其中最重要的企業特性之一,就是Seam的權限控制部分。Seam包含一個非常健全的安全認證API,通過這個API,一個典型的程式中需要用到的元件和視圖安全認證都能夠實作。Seam通過使用者角色以及基于規則的權限控制來實作安全控制。最近的版本中(2.1.0GA),Seam重寫了安全引擎,提供了大量新的相關功能來保障敏感資料的安全。本文就來看看其中一個新的特性——權限的持久化,着重于介紹ACL或者說是基于執行個體的安全機制是如何在對象級别保障你程式的安全的。

開始之前,讓我們先來看看基于規則的與基于ACL的安全控制有什麼不同。基于規則的安全控制擅長于将一堆權限授予某個對象。例如下面這段規則代碼(來自于Seam的示例項目):

Drools代碼

rule DeleteImage

no-loop

activation-group "permissions"

when

acct: MemberAccount()

image: MemberImage(mbr : member -> (mbr.memberId.equals(acct.member.memberId)))

check: PermissionCheck(target == image, action == "delete", granted == false)

then

check.grant();

end

rule DeleteImage no-loop activation-group "permissions" when acct: MemberAccount() image: MemberImage(mbr : member -> (mbr.memberId.equals(acct.member.memberId))) check: PermissionCheck(target == image, action == "delete", granted == false) then check.grant(); end

這段規則做了這麼一個限制:讓使用者有權限删除他之前上傳的圖檔。其中最重要的部分限制了,隻有圖檔的所有者才能删除圖檔。在這個例子中,該權限加在所有圖檔上,并且在圖檔和其所有者之間擁有一種連接配接關系。通過這條關系,安全規則能夠決定目前使用者即為該圖檔的所有者,并且将相應的權限授予其執行操作。不過,如果在需要檢查的對象的權限如果與目前使用者沒有關聯呢?(在這裡,使用者就是隻principal)這樣就需要ACL了。

ACL(通路控制表)記錄了某個指定的對象與某個權限之間的一一對應關系。每個記錄都擁有一個接受者(被授予權限的使用者principal)和一個操作。如果你使用過unix系列的作業系統,那麼你就會對ACL非常熟悉了,unix作業系統有一個表格用來記錄某個使用者對某個檔案的修改、删除或執行權限。當然Windows也有這樣的機制,不過Windows并沒有表現出他是這樣控制的。Seam中的ACL也是一樣的,唯一不同的就是,Seam中ACL記錄的對象是實體的執行個體,而不是檔案。通常情況下,這個對象為實體,不過我們将會看見,它可以應用到所有類型的對象上。

繼續閱讀