我正在使用Grails Spring-Security插件Spring-Security-Core-1.0.1開發Grails(1.3.3版)Web應用程序(它反過來,使用spring-security-3.0.2.RELEASE)。使用Grails前/後Spring安全註解
我想爲控制器中的操作提供基於Spring-Security註解的訪問控制。
我已經能夠使用下面的註解成功地做到基本身份驗證:
@Secured("hasAnyRole('ROLE_USER')")
def list = {
...
}
這工作 - 提供訪問列表動作/視圖,只有那些與ROLE_USER作用。
但是,允許哪些角色執行某些控制器操作的集合可能隨時間而改變,並且是系統總體狀態的函數。也就是說,允許執行給定操作的角色集合可以由服務或域對象方法返回。
的一種方式,我也許可以做這樣的事情,這將是使用Spring-Security的「基於表達式的訪問控制」(@Pre和@Post註釋),類似的例子在Spring Security Documentation:
@PreAuthorize("hasPermission(#contact, 'admin')")
public void deletePermission(Contact contact, Sid recipient, Permission permission);
在這個訪問控制決策示例中,可以使用#contact語法訪問發送到方法(例如聯繫人)的對象。
但是,我無法獲得@PreAuthorize(或@RolesAllowed)註釋來處理Grails控制器操作。如果我用註釋@PreAuthorize(而不是@Secured,如上)的列表行動,我得到以下錯誤:
Annotation @org.springframework.security.access.prepost.PreAuthorize is not allowed on element FIELD
這並不奇怪 - 動作是一個Groovy閉包(場與可執行代碼),而不是一種方法。
def list = {
testMethod()
....
}
@PreAuthorize("hasRole('ROLE_USER')")
public boolean testMethod(){
println "testMethod succeess"
return true;
}
雖然這不會引發任何錯誤,也沒有出現提供任何訪問控制:不過,我也使用方法上的註解,從封閉叫,喜歡嘗試。 (無論用戶是否具有ROLE_USER,都會打印「testMethod成功」)。因此,我嘗試了幾個不同的東西(並閱讀文檔),但一直未能找到一個使用@PreAuthorize批註和Grails控制器操作的好方法。這可能嗎?在Grails應用程序中使用Spring-Security-Annotations提供訪問控制是一種更好的方式,而訪問控制是系統狀態的一個功能?