因此,通过使用下面的行,我们可以提取用户名和密码:
SecurityContextHolder.getContext().getAuthentication().getPrincipal();
但我想获取登录用户的userId,这是我的自定义User类的属性。所以我决定这样做:
CustomUserDetails details = new CustomUserDetails();
...
details.setUser(current);
UserDetails myUserDetails = (CustomUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
BeanUtils.copyProperties(details, myUserDetails);
CustomUserDetails myDetails = details.downCast(myUserDetails);
Integer userId = myDetails.getUser().getId(); //Fetch the custom property in User class
user.setId(userId);
但是,我只是让用户通过HQL并将其放在一个临时的User类中,这是毫无意义的。
那么,获取属性userId的最佳方法是什么?看起来我最好只使用HQL查询(通过HQL获取用户登录用户的用户名)。
答案 0 :(得分:1)
我会扩展Spring Security UserDetails
类,并添加您的应用程序需要的任何适当的属性。我们通常专门针对包含userId
的不可变信息执行此操作。
然后当您需要适当的属性时:
// Get the principal from spring security
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Object principal = authentication.getPrincipal();
// verify principal if your custom user details type.
// if so, get the userid and do whatever.
if(principal != null && principal instanceof CustomUserDetails) {
CustomUserDetails userDetails = CustomUserDetails.class.cast(principal);
Long userId = userDetails.getUserId();
/* do whatever you want with user id */
}
然后在身份验证期间,只需在CustomUserDetails
的实施返回UserDetailsService
时创建您自己的UserDetails
对象。