2013-04-02 43 views
1

我的問題是:這是可能的,以確保域對象方法,甚至動​​態方法,如findByName?Grails Spring Security ACL域對象方法安全

它在服務方法上工作得很好,但我無法使它在域實例方法或域靜態方法上工作。

class Dummy { 
    string name 

    @PostFilter("hasPermission(filterObject, read)") 
    static List<Dummy> listDummies(){ 
     Dummy.list(); 
    } 
} 

從控制器調用時,即使沒有用戶連接,listDummies也會返回所有的虛擬變量。

我該怎麼辦這個工作?

在此先感謝您的幫助。

回答

1

不,這是不可能的。註釋通過觸發圍繞您調用的類實例的代理創建工作。這對於Grails服務來說是最方便的,因爲它們被自動註冊爲Spring bean,所以註釋被檢測到並被代理。您在代理上調用方法,並且它執行ACL檢查,並且只有在允許訪問時才調用真實方法。

但是對於靜態方法或動態Groovy方法,或未註冊爲Spring bean的類中的方法,此代理不會發生。在這個例子中,創建一個帶註釋的服務方法。您仍然可以將所有代碼保留在域類中,甚至可以使用動態查找器,但重要的是訪問是通過代理服務完成的。一旦檢查發生,你可以實現邏輯,無論你想要什麼。

+0

感謝您的回答!我會尋找替代品,但仍然在域對象級。我會發布我會找到的。 – Fiftoine

+0

這太糟糕了,你必須使用服務來包裝域對象的動態方法......這就像失去一個偉大的Grails功能...... – Fiftoine

+0

該實現是在Spring Security中,它沒有意識到Grails。您可以用Grails友好的方式自由地重新實現ACL支持:) –