2016-03-01 115 views
0

這是Spring Security的RunAsManagerImpl中的錯誤,還是我的期望錯誤?Spring Security的RunAsManagerImpl工作嗎?

我的(有限的)文件的理解,是一個RunAsManagerImpl在我的配置定義如果我叫doFoo()在以下幾點:

@Secured({"ROLE_FOO", "RUN_AS_BAR"}) 
public void doFoo() { 
    doBar(); 
} 

@Secured("ROLE_BAR") 
public void doBar() { 
    // ... 
} 

然後,提供的電流Authentication有作用「FOO」 doBar()將成功執行。

但它沒有,Spring拋出一個AccessDeniedException。但是,將doBar()的註釋更改爲:

@Secured("ROLE_RUN_AS_BAR") 

成功運行。

一旦source code的檢查,原因是相當明確的 - 如果它遇到以 「RUN_AS_」 開頭的屬性,它會創建:

GrantedAuthority extraAuthority = new SimpleGrantedAuthority(getRolePrefix() + attribute.getAttribute()); 

中,默認情況:

private String rolePrefix = "ROLE_"; 

所以應用的權限是「ROLE_RUN_AS_BAR」,這看起來並不正確。這是我應該提出的錯誤,還是我誤解了此功能的預期用途?

回答

1

這是預期的行爲,如文檔中描述:

的創建GrantedAuthorityImpls將用特殊 前綴,這表明它是一個角色(默認前綴值ROLE_)作爲前綴, 然後RUN_AS_關鍵字的其餘部分。例如,RUN_AS_FOO 將導致創建ROLE_RUN_AS_FOO的授權權限。

這種基本實現的目的不是冒充用戶,而是要獲得「技術角色」。例如,您的代碼的某些部分應該需要「數據庫管理器」的技術角色。沒有用戶有這個角色,但我可以以編程方式獲得。

當然,你可以只更新在SecurityContextHolderAuthentication,但有一箇中央實施點「升級」由JVM安全管理器使用時的Authentication對象可以更安全繞過這個代碼。

但是,RunAsManager是一個非常簡單的接口,以便輕鬆地重新實現:如果默認行爲與您需要的不匹配,則只有一種重新實現方法。

+0

你說得對,當然,謝謝。出於某種原因,我將「RUN_AS_關鍵字的其餘部分」解釋爲沒有「RUN_AS_」前綴,並以某種方式設法忽略他們給出的明確示例。正如你所說,很容易重新實現,我只是對我對文檔的誤解感到困惑。 – DaveyDaveDave