错误页面重定向后,Spring Security Authentication为null

时间:2017-07-12 13:08:44

标签: java spring spring-mvc spring-security error-handling

一些背景

当我尝试使用用户的信息和角色访问构建导航栏时,我遇到了一些问题,需要从处理程序拦截器上的身份验证(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;
    }
}

1 个答案:

答案 0 :(得分:0)

如果您想获得真实的客户,请尝试@AuthenticationPrincipal注释。