我正在创建一个Basic Spring Web应用程序,该应用程序涉及用户登录并进入其个人仪表板。当通过控制器实例化“登录”URL时,我使用了Default Spring Security Login表单。我想知道的是,如何检索刚刚从数据库登录的用户个人帐户信息? 这是我在登录URL实例化时在控制器类中所拥有的
@RequestMapping("dashboard")
public String goDashboard(Model model){
model.addAttribute("user", new User());
return "dashboard"; // this is just returning the viewResolver JSP page
}
我假设上面的内容不正确,因为我个人认为制作一个新的Object是错误的并且会给我null值。当我登录并尝试使用时显示:<c:out value="${user.username}" />
没有显示任何内容。
答案 0 :(得分:1)
或者你可以在控制器中获取它:
@RequestMapping("dashboard")
public String goDashboard(Model model, Principal principal){
model.addAttribute("username", principal.getName());
return "dashboard";
}
这种方法可以帮助您将业务逻辑保留在控制器中(关注点分离)。
编辑。传递用户详细信息对象:
@RequestMapping("dashboard")
public String goDashboard(Model model, Principal principal){
UserDetails userDetails = (UserDetails)((Authentication)principal).getPrincipal()
model.addAttribute("userDetails", userDetails);
return "dashboard";
}
答案 1 :(得分:0)
如果你创建新的User
对象,用户名肯定是null(如果你只有空的默认构造函数)。
你可以在jsp中获得这样的用户名:
<sec:authentication property="principal.username" />
并且不要忘记在顶部添加声明:
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
详细了解here
答案 2 :(得分:0)
你可以通过各种方式获得它。
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
然后像现在一样将它放入模型中。
<sec:authentication property="principal.username" /> // will render name
在这种情况下,您无需向控制器添加任何代码。