2012-02-11 267 views
3

我想在春季安全配置安全註釋。但我有一個關於這個問題 -安全註釋在春季安全

.... 
<security:http auto-config="true" use-expressions="true"> 
.... 

,當我使用

@Secured("CUSTOM_ACCESS") 
public String query(); 

這是行不通的。但我用

@PreAuthorize("hasRole('CUSTOM_ACCESS')") 
public String query(); 

它工作正常並應用相關角色。這是否意味着@Secured註釋不能與@PreAuthorize一起使用?

我也嘗試添加

<security:global-method-security secured-annotations="enabled" /> 

但它並不能幫助。

<security:global-method-security pre-post-annotations="enabled" /> 

上述配置工作正常。有任何想法嗎?

回答

7

首先,您的<http>元素中的use-expressions設置對方法安全性註釋沒有影響。這些使用global-method-security啓用。

使用

<security:global-method-security pre-post-annotations="enabled" /> 

將使PreAuthorize和其相關的註釋。當你啓用這個安全註解不起作用的原因是因爲沒有選民知道CUSTOM_ACCESS的含義。在其默認設置中,Spring Security的RoleVoter僅使用以前綴ROLE_開頭的屬性。有關更多信息,請參閱this FAQ

選民可以用於除了檢查簡單角色之外的事情,因此他們通常需要某種方式來確定爲某個方法配置的哪些屬性適用於他們。基於表達式的註釋與標準選民的運作方式不同。 hasRole表達式僅查找分配給用戶的命名權限。

因此,如果您爲方法安全性創建了AccessDecisionManager,而AccessDecisionVoter消耗了CUSTOM_ACCESS屬性,則@Secured註釋會產生影響。然而,既然你已經與PostAuthorize合作,你可能只想堅持。

+0

我可以有這樣的兩個嗎?' \t' – user12458 2014-10-25 13:29:29