Wicket和servlet过滤器身份验证 - 有更好的方法吗?

时间:2012-05-28 06:50:13

标签: java authentication wicket

我们的应用程序正在使用Wicket。我们使用Wicket自己的表单来处理身份验证,主要的好处是网站的外观保持一致。

我们认为我们无法进行容器身份验证,因为我们的应用程序允许用户在流中切换身份验证机制,Jetty本身也会产生相当大的摩擦,只需简单的身份验证即可在容器级别工作。 / p>

所以我们最终通过过滤器实现了身份验证(那里有很多很好的例子。)

现在我发现通过这样做,Wicket身份验证稍有破坏。发生的事情是:

  1. 匿名用户将访问该网站。
  2. 安全过滤器确定用户未经过身份验证并重定向到登录。
  3. Wicket呈现登录页面。
  4. 用户登录。
  5. Wicket将帖子处理为登录表单并重定向用户。
  6. 安全过滤器确定用户未经过身份验证并重定向...
  7. 我查看了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身份验证以及其他可能的外部身份验证类型。

1 个答案:

答案 0 :(得分:3)

您可以抓住HttpSession,但Request而不是Session

您需要的是:

WebRequest req = (WebRequest)RequestCycle.get().getRequest();
HttpSession session = req.getHttpServletRequest().getSession();

但是我很确定Wicket身份验证没有以如此明显的方式被破坏,所以我可能会尝试找出造成这个故障的原因。