一些背景
当我尝试使用用户的信息和角色访问构建导航栏时,我遇到了一些问题,需要从处理程序拦截器上的身份验证(Spring Security)中检索404错误页面上的信息。
@Component
public class AuthenticationHandlerInterceptor implements HandlerInterceptor {
@Autowired
private IAuthenticationFacade authenticationFacade;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
if (modelAndView != null) {
Authentication authentication = authenticationFacade.getAuthentication(); // <- Unexpected Null
if (authentication != null && !(authentication instanceof AnonymousAuthenticationToken)) {
modelAndView.getModel().put("user",
new UserModel(
authentication.getName(),
AuthorityUtils.authorityListToSet(authentication.getAuthorities())
)
); //put
} //fi
}//fi
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}
IAuthenticationFacade按照baeldung的建议实施。
问题
在我与某个用户进行身份验证后,所有页面请求都将通过 postHandle 进行,并且可以获取当前用户数据。除非由于某些404而重定向页面。
以下行返回null。
Authentication authentication = authenticationFacade.getAuthentication();
错误重定向
@Configuration
public class ServerPropertiesConfig extends ServerProperties {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
super.customize(container);
container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/errors/404/"));
}
}
当我访问某些页面时,如 localhost / non-existing-page / ,它将被重定向到 localhost / errors / 404 / 并在以下控制器处理:< / p>
@Controller
@RequestMapping(value = "/errors")
public class ErrorController {
@RequestMapping(value = "/{error}/")
public String errorRedirect(@PathVariable String error) {
return "errors/error" + error;
}
}
答案 0 :(得分:0)
如果您想获得真实的客户,请尝试@AuthenticationPrincipal
注释。