2012-05-04 121 views
1

我想在我的grails應用程序中使用ACL plugin。根據本教程給出的示例,http://grails-plugins.github.com/grails-spring-security-acl/docs/manual/guide/3.%20Tutorial.html我需要創建一個Service,它將實現註釋@PreAuthorize, @PostAuthorize, @PreFilter, and @PostFilter如何使用ACL插件?

我想在我的控制器中實現這種方法,而不是創建服務。我已經使用@PreAuthorize在我的行動上試過,但它返回的錯誤信息:

Annotation @org.springframework.security.access.prepost.PreAuthorize is not allowed on element FIELD 

這是否意味着,@PreAuthorize標註不適合在控制器每個動作的呼喚嗎?

請幫助。

回答

3

是的,它不適用於控制器,只適用於服務(和其他Spring bean)。它可能適用於2.0控制器中的方法,因爲控制器是Spring bean,但我沒有嘗試過。

問題是Spring Security對閉包一無所知,因爲它們是Groovy的概念。它們被調用來處理Grails的web請求,但是Spring不能攔截它,因爲它只能用於方法。

這與交易服務和關閉問題有關。你不能在服務中定義一個閉包,並且它是事務性的,因爲Spring沒有看到它。 Groovy可以讓你像關閉方法那樣調用閉包,但它只是語法上的糖。

+0

非常感謝!所以這意味着我不得不爲每個控制器創建一個服務,以便使用ACL插件。我還有一個問題,除了使用ACL插件之外,還有其他方法可以爲每個操作分配權限嗎?非常感謝! – chemilleX3

+0

控制器和服務之間不需要1-1;你可能能夠把所有東西放在一個服務中,因爲邏輯是相似的,但是肯定有一些就足夠了。 –

+0

非常感謝你..有可能不是爲我使用提到的註釋創建服務,我只是將我的控制器中的動作轉換爲方法?這是否合乎邏輯? – chemilleX3