【问题标题】:Wicket and servlet filter authentication - is there a better way?Wicket 和 servlet 过滤器身份验证 - 有没有更好的方法?
【发布时间】:2012-05-28 06:50:13
【问题描述】:

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

我们认为我们无法进行容器身份验证,因为我们的应用程序允许用户在中途切换身份验证机制,而 Jetty 本身无论如何都会产生相当多的摩擦,只是让简单的身份验证在容器级别工作。

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

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

  1. 匿名用户会访问该网站。
  2. 安全过滤器确定用户未通过身份验证并重定向到登录。
  3. Wicket 呈现登录页面。
  4. 用户登录。
  5. Wicket 将帖子处理到登录表单并将用户重定向回来。
  6. 安全过滤器确定用户未通过身份验证并重定向...

我查看了 AuthenticatedWebSession 的子类,希望找到某种方法可以获取 HttpSession 并设置一个会话属性,然后可以从过滤器中检查该属性。但是我终其一生都找不到办法。

我所做的是制作另一个过滤器,编码如下:

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 身份验证和可能的其他外部身份验证类型。

【问题讨论】:

    标签: java authentication wicket


    【解决方案1】:

    您可以获取您的HttpSession,尽管通过Request 而不是Session

    你需要的是:

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

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

    【讨论】:

    • 我不认为我在这里看到了故障,但我们对身份验证的使用肯定很奇怪。 Wicket 身份验证不会更新其自身会话之外的任何内容,这可能是因为大多数人将其作为服务器上唯一的 web 应用程序运行,并且不尝试使用任何类型的外来身份验证。
    • @Trejkaz 我明白了,您想在 Wicket 之外使用 Wicket 身份验证的结果吗?那么您最好的选择确实是手动将结果写入您的HttpSession,以避免不得不依赖 Wicket 的会话命名约定。
    猜你喜欢
    • 2015-04-01
    • 2012-10-27
    • 2011-11-18
    • 2019-11-01
    • 2018-11-14
    • 1970-01-01
    • 2013-09-18
    • 2015-10-08
    相关资源
    最近更新 更多