2017-09-04 2 views
0

Unsere Anwendung verwendet sparkjava http://sparkjava.com/ als REST-Framework. Der Anlegestegserver ist in die Anwendung eingebettet (sparkjava default). Wir verwenden auch Feder für die Abhängigkeitsinjektion.Wie integriere Waffel NegotiateSecurityFilter Spring-Sicherheit mit Sparkjava Embedded Anlegesteg?

Für die AD-Authentifizierung müssen wir den NegotiateSecurityFilter der Waffle integrieren.

Gemäß der Waffeldokumentation und mehreren Onlineressourcen, einschließlich stackoverflow, ist ein DelegatingFilterProxy mit dem Namen springSecurityFilterChain erforderlich.

Da wir aber nicht Frühling MVC, ich habe es wie folgt hinzufügen:

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

Und da ein Context noch nicht vorhanden ist, müssen in der folgenden Art und Weise hinzuzufügen:

sparkContext.addEventListener(new ContextLoaderListener()); 

Aber es gibt den Fehler "Kontext kann nicht initialisiert werden, da bereits ein Stammanwendungskontext vorhanden ist - prüfen Sie, ob Sie mehrere ContextLoader haben" zum Zeitpunkt des Serverstarts.

Bitte lassen Sie mich eine Lösung in diesem Szenario wissen, wenn Sie erfolgreich Spring-Sicherheit DelegierenFilterProxy mit integriertem Anlegesteg und Sparkjava (ohne Feder MVC) integriert haben.

Antwort

0

Dies ist, wie ich es endlich erreicht:

Im Hauptverfahren, bei dem ich Zugang zum sparkContext haben:

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

addSPNEGOFilter(sparkContext); 

und die Durchführungsverfahren sind wie:

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)); 
} 

hinzufügen die folgenden Eigenschaften an den Halter:

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"); 
}