2016-04-05 162 views
1

我的應用程序使用J2eePreauth認證供應商,這裏是常見的代碼來檢索MYUSER對象:當getPrincipal()返回User對象並返回UserDetail對象時?

MyUser user = (MyUser)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 

它的工作原理所有的時間,直到最近我可能會升級春季安全或某事,現在它給了我

org.springframework.security.core.userdetails.User cannot be cast to com.myapp.domain.MyUser 

和類的MyUser只是實現接口UserDetails

這是非常奇怪的是,鑄造工程的所有關於最近upda的時間,但它崩潰了。

所以我的問題是什麼時候SecurityContextHolder.getContext().getAuthentication().getPrincipal()返回UserDetail對象,並不會當它返回org.springframework.security.core.userdetails.User

+0

也許功能您正在使用的Spring版本?你是從哪個版本升級Spring Security的?主版本和次版本(即非補丁)可以/將更改API。 Spring應該有在線提供的遷移指南來進行主要版本升級。 –

+2

我不認爲你在問正確的問題。類org.springframework.security.core.userdetails.User實現UserDetails,使它們是一樣的。 主體始終是返回對象的UserDetailsS​​ervice的結果。你的UserDetailsS​​ervice是什麼樣的? –

+0

從spring-boot-starter-parent 1.3.6移到1.4.4後,我遇到同樣的問題。根據maven中的依賴層次結構,Spring安全性是4.1.4。 –

回答

1

它總是返回一個類型:對象

Object object = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 

而返回的對象是org.springframework.security.core.userdetails.User類型。如果你使用Spring Security的預定義的用戶類,那麼你可以將它轉換爲用戶類型:

org.springframework.security.core.userdetails.User user = (User)object; 

但是,如果你定義了你的自定義用戶類,那麼還有另一種方法是:

UserDetails userDetails = (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 

這將在100%的時間內工作,因爲Spring Security的內置User類實現了UserDetails類。 (你可以閱讀更深入的瞭解春源代碼) 然後通過找到有效用戶對象: //假設你IdLong,定義UserRepository interface

interface UserRepository extends JpaRepository<domain.User,Long> { 
    domain.User findOneByUsername(String username); 
} 

然後

@Autowired 
UserRepository userRepository; 
myCustomApp.domain.User = userRepository.findOneByUsername(userDetails.getUsername());