如何整合华夫饼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");
}