2012-02-06 219 views
0

之外訪問Spring Security的ThreadLocal的用戶信息,我有需要通過用戶登錄信息到他們稱之爲通用的API項目的多個項目。 common-api沒有通過方法調用傳入的用戶憑據,所以我希望通過Threadlocal變量提供這些信息。從春季安全

第一個這樣的項目需要提供這些信息,是使用Spring Security的一個REST的Web服務的API項目,並坐在我共同的API項目的頂部。

I see that Spring Security stores the user information in a ThreadLocal variable ...有沒有到,而不一定需要知道的是,Spring Security是誰把它從通用的API項目訪問此辦法?我對Spring Security非常陌生,對於使用Threadlocals也很陌生,所以不勝感激。

回答

2

發佈自己的解決方案在此情況下,它是在路上別人有用。

Spring安全性(默認情況下)實際上確實將用戶信息存儲在Threadlocal變量中,但common-api將無法訪問它,除非它添加spring-security依賴項 - 如果它的用戶信息可以訪問使用下面的代碼片段(假設你在同一個線程中執行):

SecurityContext secureContext = SecurityContextHolder.getContext(); 
Authentication auth = secureContext.getAuthentication(); 
Object principal = auth.getPrincipal(); 

String userName = null; 
if (principal instanceof UserDetails) { 
    UserDetails userDetails = (UserDetails) principal; 
    userName = userDetails.getUsername(); 
} else { 
    userName = principal.toString(); 
} 

我實現了不同但是,因爲我不希望引入春季安全的共同的API項目的解決方案,我不能總是依靠Spring Security作爲API的用戶。所以,我在common-api中創建了一個Singleton bean,其中包含我自己定義的ThreadLocal變量,可以從其他項目中設置並從common-api項目中訪問(同樣,假設它們在同一個線程中運行)。

代碼段: