2016-04-05 103 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());