我想从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轻松获得?还是可以修改UserDetailsService以包含ID?
我对这个框架很陌生。我读到使用另一个存储库可能会有所帮助,但我不想要另一个存储库。
答案 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的其他类似注释。