2010-04-29 93 views
7

我正在研究一個涉及Spring Security ACL的項目,並且我遇到了創建權限BasePermission.CREATE。請有人解釋一下這應該如何工作或者它允許某人做什麼?有人可以解釋Spring Security BasePermission.Create嗎?

這是我的理解,每個對象都有一個acl,每個acl有很多ace,每個ace有一個sid和一個許可。如果必須創建它才能將acl附加到它,您如何授予對象創建權限?

回答

7

Spring安全性通過ObjectIdentity接口間接授予域對象的權限。

至於你提到,目前通常的情況是,你創建或先獲得域對象,然後構造一個ObjectIdentityImpl域對象:

MyDomainObject secured = new MyDomainObject(); 
ObjectIdentity securedIdentity = new ObjectIdentityImpl(secured); 

然後,您使用ObjectIdentity實例來檢索使用彈簧安全框架的ACL。

但是,這不是使用對象標識的唯一方法。您可以將引用傳遞給不是實際業務對象的objectIdentity,但有一些識別它的方法(如果它已創建)。

例如,假設我們想要保護文件。我們可以用一個java.io.File實例來創建ObjectItentity。身份中的File對象只是對文件的引用 - 它不包含實際的文件 - 文件甚至可能不存在,但我們有一個ObjectIdentity,然後我們可以推理安全性並獲取ACL。

此模式可以應用於任何類型的域對象。創建一個DomainObjectPrototype實現,該實現根據域安全所需的域功能描述域對象,但實際上並不需要對域對象的引用。 YOu可以將此視爲某些服務實際創建該域對象所需的詳細信息。 PS:讓我承認,我從來沒有使用過彈簧安全裝置,但設計模式看起來很清晰,看了一下example

編輯:我已經更新了這個,希望更清楚 - 沒有必要創建ObjectIdentity的實現,就像我原來寫的一樣。

+1

謝謝你的迴應。但我想澄清一下。你的意思是,如果我想限制創建一個Widget類,我可能會做類似下面的事情? ObjectIdentity securedIdentity = new ObjectIdentityImpl(Widget.class,Widget。RESERVED_CLASS_ID); 然後我會檢查創建權限是否允許某些sid。 – 2010-05-04 16:06:25

+1

當訪問控制不依賴於Widget類的特定實例時,則可以這樣做。如果您需要特定於實例的控件,請創建一個WidgetPrototype類,其中包含定義訪問控制所需的域屬性。 – mdma 2010-05-04 16:51:28

0

更廣泛地思考有兩種類型的權限:類和實例。對象創建是一個類的權限 - 你有權創建一個新的實例。當您嘗試將其應用於單個實例時,這沒有意義。讀取權限可以是。您可以擁有讀取所有實例的權限,或者您只有權限讀取一些明確列舉的實例。

如果你想過經典的「驚喜生日派對電子郵件」問題,你會感到困惑。這是發送給每個人的辦公室電子郵件,除了生日男孩計劃驚喜的生日派對。在這種情況下,您需要創建和發送電子郵件的類CREATE權限,並且每個人都具有讀取權限來讀取消息。但是,一個人擁有一個DENY READ實例,這樣他就無法閱讀該消息。

+0

我明白需要CREATE權限。我的問題是如何特別在彈簧安全中使用它。謝謝你。 – 2010-05-07 14:57:49