使用Spring安全性保护Wicket应用程序时使用的主要方法是在AuthenticatedWebSession中包含此类构造:
Authentication authentication = authenticationManager
.authenticate(new UsernamePasswordAuthenticationToken(username, password));
SecurityContextHolder.getContext().setAuthentication(authentication);
authenticated = authentication.isAuthenticated();
与Spring Security相反,身份验证请求来自后端,因此任何HTTP请求处理都为时已晚。那说整个Spring Security过滤器链都是DOWN无所谓,请参阅 AbstractAuthenticationProcessingFilter 中的这一行:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
if (!requiresAuthentication(request, response)) {
chain.doFilter(request, response);
return;
}
// (...) "normal" Spring authentication process which will never take place
successfulAuthentication(request, response, chain, authResult);
}
requiresAuthentication方法检查请求路径上的“j_spring_security_check”。当然,采取的方法并不存在。
结果是什么?由于您仅依赖于从应用程序上下文获取的AuthenticationManager,因此通常在过滤器链中触发的操作不会发生:例如,Spring remember-me服务将无法工作。过滤器方法中正在设置Cookie,过早返回。可以读取Cookie,但它们不存在。
我的问题是 - Wicket改编是否有严格的Spring Security?我的意思是它应该跳过链但是触发所有那些通常在后端运行的动作,就像Wicket所做的那样。
谢谢!