我需要在非默认的Spring链中检索确切的Principal Object(不是在带有Principle注入的控制器中)。我正在使用spring-websocket和client实现一些拦截器,以便从oauth头标记值设置用户Principal。
现在的主要问题是我无法直接获取Principal对象,而是获取用户名String。
我已创建此方法,但它返回String(获取ClassCastException):
public Principal setApplicationAuthentication(String username) {
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
Authentication auth = new UsernamePasswordAuthenticationToken(userDetails.getUsername(),
userDetails.getPassword(), userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(auth);
return (Principal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}
答案 0 :(得分:0)
我只是通过调用此方法来解决这个问题:
SecurityContextHolder.getContext().getAuthentication()
身份验证已经是具有类层次结构
的Principal(超类)答案 1 :(得分:0)
试试这个:
public Principal setApplicationAuthentication(String username) {
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
Authentication auth = new UsernamePasswordAuthenticationToken(userDetails,
userDetails.getPassword(), userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(auth);
return (Principal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}
这将为您提供当前登录的实际主要对象。
请注意,UsernamePasswordAuthenticationToken
包含principal
类型的Object
对象,因此您可以根据需要设置UserDetail
或String
对象