我们的应用程序使用sparkjava http://sparkjava.com/作为REST框架。 jetty服务器嵌入在应用程序中(默认为sparkjava)。我们也使用spring进行依赖注入。
为了提供AD身份验证,我们需要集成华夫饼的NegotiateSecurityFilter。
根据华夫饼干文档和一些在线资源(包括stackoverflow),需要一个名为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的main方法中:
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");
}