在Java Spring中获取登录用户的其他属性的最佳方法是什么?

时间:2015-12-31 07:47:26

标签: spring hibernate hql

因此,通过使用下面的行,我们可以提取用户名和密码:

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获取用户登录用户的用户名)。

1 个答案:

答案 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对象。