有没有办法从Spring Security中获取UserId?

时间:2019-05-15 13:52:21

标签: java spring-security

我想从Spring Security中获取用户ID,目前我找到了此解决方案:

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

if (principal instanceof UserDetails) {
   String username = ((UserDetails) principal).getUsername();
   User user = userRepository.findAllByUsername(username);

}

然后使用该user.getId()方法。是否没有内置的方法可以使ID轻松获得?还是可以修改UserDetailsS​​ervice以包含ID?

我对这个框架很陌生。我读到使用另一个存储库可能会有所帮助,但我不想要另一个存储库。

1 个答案:

答案 0 :(得分:0)

据我了解,您的主要关注点是不是每次需要登录用户的ID时都重复此代码?如果是这种情况,只需将代码移至某个服务,例如UserService:

    @Service
    public class UserService {
         public User getLoggedInUser(long id) {
             // your code from original post goes here
         }
    }

,然后将此服务包括在类中。您打算使用此功能并使用它。说您的类被称为是一种称为MyController的RestController:

@RestController
public class MyController{
    private UserService userService;

    public MyController(UserService userService){
        this.userService = userService;
    }

    public void myMethod() {
        User authUser = userService.getLoggedInUser();
    }
}

或者如果仅需要ID,请更改返回ID的方法,并改用它:

long userId = userService.getLoggedInUserId();

新的UserService方法中的代码与上面的问题相同,但是在MyController中使用该代码的代码更具可读性。

如果仅需要此ID即可检查权限,请look into改用@PreAuthorize("hasRole('ROLE_SMTH')")或Spring Security的其他类似注释。