2010-02-12 78 views
3

連接ACL和受保護資源的最佳方式是什麼?如何將ACL與受保護資源連接?

1)受保護的資源是否應該保存對其ACL的引用?

interface AclHolder { 
    Acl getAcl(); 
} 

這很簡單,但是如果對象存在於數據庫中,它必須在可以檢查訪問權限之前構建。

2)Spring Security使用具有完全限定類名和對象標識的機制來附加並從外部檢索ACL。這可能會導致n + 1選擇問題,因爲多個ACL無法通過某個標準進行選擇。如果在重構期間類名改變,該系統可能會中斷。

3)另一種方法是在ACL中存儲對受保護資源的引用。通過延遲加載,可以在不從數據庫加載受保護資源的情況下檢查ACL。

class Acl<T> { 
    @Lazy public T protectedResource; 
    // acl methods ... 
} 

4)每個對象可以在窗口一個安全描述符(像):

class SecurityDescriptor<T> { 
    public Acl acl; 
    @Lazy public T protectedResource; 
    // ... 
} 

什麼是好?

臨時解決方案:由於域對象可以實現它,所以我將實現AclHolder接口,並且還可以在不影響域對象的情況下附加ACL。

+0

我在想你是否有這個工作?我正在實施同樣的事情(例如,我自己的ACL服務),並且正在考慮相同的選擇。我有一個問題,你如何保護你的服務方法?註釋? AOP?或每個服務方法開始時的傳統代碼。 還有額外的經驗教訓? – HDave 2010-05-25 14:42:50

回答

0

spring security acl實現自帶緩存內置,一旦緩存被加熱,如果你通過spring-security註解強制實現,那麼你將檢索acl的方式主要針對給定的對象實例,因此你不會真的命中n + 1問題,而且它是基於jdbc的。
雖然域對象類名稱的更改可能會成爲一個問題,但這裏acl_class表存儲的是類身份,並且應該相當小,以便對其進行管理,因爲該級別的重構發生在生產系統的主要版本之間。 Spring-security acl實現是以非侵入式方式快速實現acl實現的合理選擇(即,ur域模型仍然不確定安全性,這主要是應用層關注的問題)。