我们的应用程序正在使用Wicket。我们使用Wicket自己的表单来处理身份验证,主要的好处是网站的外观保持一致。
我们认为我们无法进行容器身份验证,因为我们的应用程序允许用户在流中切换身份验证机制,Jetty本身也会产生相当大的摩擦,只需简单的身份验证即可在容器级别工作。 / p>
所以我们最终通过过滤器实现了身份验证(那里有很多很好的例子。)
现在我发现通过这样做,Wicket身份验证稍有破坏。发生的事情是:
我查看了AuthenticatedWebSession的子类,希望能找到一些方法来获取HttpSession并设置一个session属性,然后可以从过滤器中检查。但是我无法为我的生活找到办法。
我采取的措施是制作又一个过滤器,编码如下:
public class StealWicketUserFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// Nothing to initialise.
}
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException
{
filterChain.doFilter(servletRequest, servletResponse);
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
if ("POST".equals(httpServletRequest.getMethod()) &&
"/sign_in".equals(httpServletRequest.getRequestURI())) {
HttpSession session = httpServletRequest.getSession();
ServerUser currentUser = (ServerUser)
session.getAttribute("wicket:webUIServlet:currentUser");
if (currentUser != null) {
session.setAttribute(CombinedSecurityFilter.CURRENT_USER_ATTRIBUTE,
currentUser);
}
}
else if ("/sign_out".equals(httpServletRequest.getRequestURI())) {
HttpSession session = httpServletRequest.getSession();
session.removeAttribute(CombinedSecurityFilter.CURRENT_USER_ATTRIBUTE);
}
}
@Override
public void destroy() {
// Nothing to destroy.
}
}
这当然有效(并且将继续有效,直到Wicket更改其存储会话属性的前缀。)
我想我想知道的是,这是否是一个坏主意以及是否有“适当的Wicket方式”来做这类事情。
至于我们不单独使用Wicket身份验证的原因 - 原因是我们希望支持SPNEGO身份验证以及其他可能的外部身份验证类型。
答案 0 :(得分:3)
您可以抓住HttpSession
,但Request
而不是Session
。
您需要的是:
WebRequest req = (WebRequest)RequestCycle.get().getRequest();
HttpSession session = req.getHttpServletRequest().getSession();
但是我很确定Wicket身份验证没有以如此明显的方式被破坏,所以我可能会尝试找出造成这个故障的原因。