如何整合华夫饼NegotiateSecurityFilter弹簧安全与sparkjava嵌入式码头?

问题描述:

我们的应用程序使用sparkjava http://sparkjava.com/作为REST框架。码头服务器嵌入在应用程序中(sparkjava默认值)。我们也使用spring来进行依赖注入。如何整合华夫饼NegotiateSecurityFilter弹簧安全与sparkjava嵌入式码头?

为了提供AD认证,我们需要整合华夫饼的NegotiateSecurityFilter。

根据华夫饼干文档和包括*在内的几个在线资源,需要一个名为springSecurityFilterChain的DelegatingFilterProxy。

但由于我们没有使用Spring MVC的,我一定要如下添加:

ServletContextHandler sparkContext = new ServletContextHandler(ServletContextHandler.SESSIONS); 
    sparkContext.addFilter(new FilterHolder(new DelegatingFilterProxy("springSecurityFilterChain")),"/*", EnumSet.allOf(DispatcherType.class)); 

而且由于ContextLoaderListener的已经不存在,需要通过以下方式添加:

sparkContext.addEventListener(new ContextLoaderListener()); 

但它给出错误“无法初始化上下文,因为已经存在根应用程序上下文 - 检查服务器启动时是否有多个ContextLoader”。

如果您成功地将spring-security DelegatingFilterProxy与嵌入式jetty和sparkjava(不使用spring MVC)集成,请让我知道这种情况下的解决方案。

这是我如何实现它最后:

在我有机会获得sparkContext的主要方法:

ServletContextHandler sparkContext = new ServletContextHandler(ServletContextHandler.SESSIONS); 
sparkContext.setContextPath("/"); 
sparkContext.addServlet(DefaultServlet.class, "/*"); 

addSPNEGOFilter(sparkContext); 

和执行方法有:

private void addSPNEGOFilter(ServletContextHandler sparkContext) { 
    final ServletHandler handler = new ServletHandler(); 
    final FilterHolder fh = handler.addFilterWithMapping(NegotiateSecurityFilter.class, <SPNEGO_FILTER_PATH>, 
      EnumSet.allOf(DispatcherType.class)); 
    setNegotiateFilterParams(fh); 
    sparkContext.addFilter(fh, <SPNEGO_FILTER_PATH>, EnumSet.allOf(DispatcherType.class)); 
} 

添加以下属性给持有者:

private static void setNegotiateFilterParams(final FilterHolder fh) { 
    fh.setInitParameter("principalFormat", "fqn"); 
    fh.setInitParameter("roleFormat", "both"); 

    fh.setInitParameter("allowGuestLogin", "false"); 
    fh.setInitParameter("impersonate", "false"); 

    fh.setInitParameter("securityFilterProviders", 
      "waffle.servlet.spi.NegotiateSecurityFilterProvider"); 
    fh.setInitParameter("waffle.servlet.spi.NegotiateSecurityFilterProvider/protocols", "Negotiate"); 
}