我正在尝试加载一些应该可用于每个HTTP请求的基本用户信息。我读到我可以使用带有@ModelAttribute方法的@ControllerAdvice类来完成此操作。例如:
@ControllerAdvice
public class DefaultController{
@ModelAttribute
public void load(ModelMap model){
}
}
但是,我无法访问由Spring Security管理的Principal对象。我尝试过以下方法:
@ModelAttribute
public void load(ModelMap model, @AuthenticationPrincipal CustomUser user){
}
和
@ModelAttribute
public void load(ModelMap model, Principal user){
//Cast to CustomUser object
}
但这两个都行不通。我得到用户对象的空值。我想知道是否有人知道如何在@ModelAttribute方法中获取Principal对象
答案 0 :(得分:3)
我只需要首先检查对象是否为空
@ModelAttribute
public void load(ModelMap model, @AuthenticationPrincipal CustomUser user){
if(user != null){
long userId = user.getId();
//Query database with userId and add data to model
}
}
答案 1 :(得分:2)
您可以使用Authentication
org.springframework.security.core.context.SecurityContextHolder
个对象
@ModelAttribute
public void addUserToModel(Model model) {
try {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth.getName();
// do something
} catch (Exception ex) {
}
}
事实上,您可以在应用程序的任何位置使用SecurityContextHolder
。