如何整合华夫饼NegotiateSecurityFilter spring-security与sparkjava嵌入式码头?

问题描述 投票:0回答:1

我们的应用程序使用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)集成,请在此方案中告诉我一个解决方案。

spring-security embedded-jetty spark-java waffle
1个回答
0
投票

这就是我最终实现它的方式:

在我可以访问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");
}
© www.soinside.com 2019 - 2024. All rights reserved.