2011-08-08 177 views
2

對於我們當前的項目,我們正在集成JSF和Spring框架。我想使用Spring Security來處理認證和授權。到目前爲止,我已經實施了自定義的PasswordEncoderAccessDecisionVoter,這些工作正常。現在我試圖確保使用@Secured註釋(其中包括)的方法,但我無法按照我預期的那樣工作。Spring安全保護方法

似乎@Secured註釋僅適用於直接從JSF層調用的bean方法。這裏有一個簡單的例子:

@Named("foobarBean") 
@Scope("access") 
public class FoobarBean 
{ 
    @Secured("PERMISSION_TWO") 
    public void dummy() 
    { 
    } 

    @Secured("PERMISSION_ONE") 
    public String save() 
    { 
     dummy(); 
    } 
} 

保存方法()從JSF層被稱爲是這樣的:

<h:commandButton id="save" action="#{foobarBean.save}" /> 

我們AccessDecisionVoter然後問上PERMISSION_ONE投票,但上PERMISSION_TWO。這是按照設計工作(我希望不是)或者我做錯了什麼(可能是什麼?)。

我會發布更多的代碼或配置,但我不知道哪個部分是相關的,我不想混亂這篇文章。

回答

2

這是一個代理AOP的簡單問題!如果您將Proxy AOP用於安全性,則代理服務器只能攔截通過代理服務器的calles。如果一個方法直接調用同一個bean的另一個方法,那麼沒有代理可以截獲這個調用。 - 這就是爲什麼只考慮save()的安全註釋的原因。

一個解決方案是使用AspectJ AOP而不是代理AOP。 (它也支持Spring(Security)。)

1

是的,這就是AccessDecisionVoter的工作原理。它採用資源上允許的所有角色(在你的情況下是方法),併爲這些角色投票表示當前經過身份驗證的用戶的角色。如果角色匹配,則只授予權限。

在你的情況下,爲save方法定義的唯一角色是PERMISSION_ONE,因此安全系統將僅檢查此角色。如果登錄的用戶具有該角色,則將執行此方法。

+0

好吧,我明白了,我很好地調用了save()方法。但是save()然後調用dummy(),這也是一種安全的方法。我期望方法dummy()在調用方法save()時被檢查所需的權限...... –