我的应用程序使用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
答案 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());