我有一个带有两个端点的Spring-boot / Thymeleaf应用程序:
1:/ int / :需要sso / authorization; 2. / ext / :公开页面,每个人都可以访问;
使用PreAuthenticationFilter,我可以保护/ int / *页面。当用户尝试访问/ ext / *页面时,我希望能够在控制器中告知该用户先前是否已通过身份验证(通过访问安全页面)。当前,我将经过身份验证的Principal对象保存在UserDetailsService的loadUserDetails()中的HTTP会话中。只是好奇这是否是正确的方法(或更好的方法)。
答案 0 :(得分:0)
您可以通过@AuthenticationPrincipal批注获取经过身份验证的对象,而不是从httpsession获取该对象并将其转换回每种控制器方法的对象。
让我给你一个例子,给定登录页面是公共页面,用户对象如下:
用户类别:
public class User implement UserDetails {
String contact;
Integer age;
}
控制器:
@GetMapping(value = "/login")
ModelAndView login(@AuthenticationPrincipal User user) {
if (user == null) {
return new ModelAndView("/login");
} else {
return new ModelAndView(new RedirectView("/home"));
}
}