当getPrincipal()返回User对象并返回UserDetail对象时?

时间:2016-04-05 22:24:09

标签: spring spring-security

我的应用程序使用J2eePreauth身份验证提供程序,这是检索MyUser对象的常用代码:

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

它一直有效,直到最近我可能升级Spring安全或者现在它给了我

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

MyUser的类只是实现接口UserDetails

非常奇怪的是,演员阵容一直在运作,但是最近的更新让它崩溃了。

所以我的问题是SecurityContextHolder.getContext().getAuthentication().getPrincipal()何时返回UserDetail对象以及何时返回org.springframework.security.core.userdetails.User

1 个答案:

答案 0 :(得分:0)

它总是返回一种类型:对象

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

返回对象的类型为org.springframework.security.core.userdetails.User。如果您使用预定义的Spring Security用户类,则可以将其强制转换为用户类型:

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

但是,如果您定义自定义User类,则还有另一种方法:

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

这将在100%的时间内起作用,因为Spring Security的内置User类实现了UserDetails类。 (您可以阅读Spring源代码以获得更深入的了解) 然后找到您的活动用户对象: //假设您的Id字段为Long,请定义UserRepository interface

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

然后

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