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