我使用Spring Security进行身份验证。我保存在@SessionAttribut这个auth因为我想访问用户对象。
@ControllerAdvice(basePackages= {"com.sencerseven.blog.admin","com.sencerseven.blog.controller"})
@SessionAttributes("User")
public class SessionScope {
@Autowired
private UserService userService;
@ModelAttribute("User")
public User session() {
Authentication authentication =
SecurityContextHolder.getContext().getAuthentication();
if(authentication != null) {
User user = userService.getByEmail(authentication.getName());
if(user != null) {
return user;
}
}
return null;
}
}
@Controller
@RequestMapping("/post")
public class PostController {
@RequestMapping(value= {"/{post}"})
public ModelAndView postPage(@SessionAttribute("User")User tempUser,@PathVariable("post")String tempPostName ) throws NotFoundException {
...
.....
}
@PostMapping("addcomment")
@ResponseBody
public String saveComment(@SessionAttribute("User")User tempUser,@RequestParam("post_id")int id,@RequestParam("comment")String tempComment) {
....
.....
}
}
@SessionAttribute(“User”)在PostPage方法中返回null。页面抛出异常
java.lang.NullPointerException at com.sencerseven.blog.controller.PostController.postPage(PostController.jav a:54) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
。但SaveComment方法正常工作。@ SessionAttribute(“User”)在SaveComment访问用户对象时它不是null返回。
为什么?我该如何解决这个问题?
答案 0 :(得分:1)
Spring Security已经支持这种开箱即用(如文档here所述)。你试图在你自己的实现中试图制造复杂的东西。而不是使用@SessionAttribute
使用@AuthenticationPrincipal
注释让Spring Security查找并注入用户。
因此,基本上删除您的SessionScope
控制器建议,并将@SessionAttribute
替换为您控制器上的@AuthenticationPrincipal
。
@Controller
@RequestMapping("/post")
public class PostController {
@RequestMapping(value= {"/{post}"})
public ModelAndView postPage(@AuthenticationPrincipal User tempUser, @PathVariable("post") String tempPostName ) throws NotFoundException {
...
}
@PostMapping("addcomment")
@ResponseBody
public String saveComment(@AuthenticationPrincipal User tempUser, @RequestParam("post_id") int id, @RequestParam("comment") String tempComment) {
...
}
}
您必须确保自己的User
也是Spring Security使用的User
。如果不是这种情况而不是控制器建议,请使用自定义AuthenticationSuccessHandler
,将自己的User
添加到Session
一次(而不是每次请求)。