2015-07-23 23 views
7

Ich benutze Tomcat 7. Ich habe native CORS-Filterung eingerichtet, wie in der offiziellen Tomcat-Dokumentation vorgeschlagen.Tomcat CORS Filter und Spring Security

Ich habe alles getestet, was ich konnte, aber es funktioniert nicht. Da ich eine Herstelleranwendung verwende, von der ich weiß, dass sie Spring Security-Filter verwendet, frage ich mich, ob es hier einen bekannten Fehler gibt.

Hier ist, was ich rede:

<!-- Spring Security START --> 
<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/</url-pattern> 
</filter-mapping> 
<!-- Spring Security END --> 

Ich habe die folgenden Konfigurationen Web.xml hinzugefügt:

<filter> 
    <filter-name>CorsFilter</filter-name> 
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>CorsFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Ich weiß, es ist minimal, aber es sollte funktionieren.

Ich habe auch versucht, vorher eine längere Version:

<filter> 
    <filter-name>CorsFilter</filter-name> 
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> 
    <init-param> 
     <param-name>cors.allowed.origins</param-name> 
     <param-value>*</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.allowed.methods</param-name> 
     <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.allowed.headers</param-name> 
     <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.exposed.headers</param-name> 
     <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.support.credentials</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.preflight.maxage</param-name> 
     <param-value>10</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>CorsFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Es hat nicht funktioniert entweder.

Hat jemand Erfahrung mit der Einrichtung von CORS-Filtern mit Spring Security?

+2

Könnten Sie genauer über "es funktioniert nicht" sein? – Djizeus

+0

was ist deine genaue tomcat version? – salyh

+0

Haben Sie versucht, den Korsfilter vor den Federfilter zu setzen? – user467257

Antwort

0

Ihr Lieferant Anwendung muss aktiviert sein, auf eingehende reagieren Preflight-Optionsanforderungen mit dem entsprechenden CORS-Header. Es ist kein Fehler, es ist nur eine Konfiguration und/oder einige Codezeilen, die fehlen, um CORS für Spring zu aktivieren. Das Aktivieren von CORS ist keine große Sache für Ihren Lieferanten, aber es könnte für Sie eine große Sache werden, besonders wenn Sie keine Kopie Ihres Java-Projekts in Eclipse haben.

Wenn Sie Glück haben, dass Ihre Anbieteranwendung bereits auf Spring Framework 4.2 RC2 ausgeführt wird, können Sie die Konfiguration in XML selbst vornehmen, siehe https://spring.io/blog/2015/06/08/cors-support-in-spring-framework. Versuchen Sie einfach, den Block <mvc:cors> zu Ihrer Anwendung web.xml hinzuzufügen und konfigurieren Sie die Werte entsprechend Ihren Anforderungen. Ich habe es nicht selbst getestet, aber es sollte ausreichen.

Aber ich fürchte, Sie vielleicht nicht so viel Glück sein ...

Dann werden die Dinge ein wenig kompliziert, wenn Sie Ihren Anbieter nicht die Anwendung/WAR-Datei aktualisiert möchte fragen. In diesem Fall, schauen Sie sich diesen Beitrag an: Can't set Authentication Header with Angular and Spring Security. Die Antwort in der Post beschreibt die Konfiguration, die in der Anwendung web.xml(Erstellen Sie einen neuen CORS-Filter und binden Sie es an eine Klasse, die Sie erstellen müssen) und wie die zusätzliche Java-Filterklasse (im Beispiel Die Klasse heißt SimpleCorsFilter im Paket com.abcinsights.controller) muss aussehen, um es funktionieren zu lassen. Um die neue Java-Klasse zu Ihrer Anwendung hinzuzufügen, müssen Sie Ihre WAR-Datei entpacken, die neue Java-Filterklasse erstellen und hinzufügen (die Paketdeklaration in Ihrer neuen Java-Klasse nicht vergessen) und neu packen. Dies ist der komplizierteste Teil, denn wenn Sie in Ihrer Klasse oder beim Umpacken einen Fehler gemacht haben, wird der Fehler wahrscheinlich erst nach der erneuten Bereitstellung angezeigt.

-1

Sie müssen die CORS-Filter vor dem Spring Security-Filter in web.xml hinzufügen

CORS OPTIONS HTTP-Anforderung muss nicht von Spring Security verarbeitet werden

+0

nun, Mourad hat Recht. Auf hohem Niveau muss dies getan werden. – mika

0

Ich könnte falsch liegen.aber jede Konfigurationsdatei habe ich immer die param Namen anders als Ihr gesehen hatte, vielleicht das Problem das ist, was ich habe immer gesehen und getan war:

<filter> 
    <filter-name>CorsFilter</filter-name> 
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> 
    <init-param> 
     <param-name>cors.allowOrigin</param-name> 
     <param-value>*</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.supportedMethods</param-name> 
     <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.supportedHeaders</param-name> 
     <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.exposedHeaders</param-name> 
     <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.supportsCredentials</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <init-param> 
     <param-name>cors.maxAge</param-name> 
     <param-value>10</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>CorsFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
0

Ich hatte eine ähnliche Konfiguration und das Hauptproblem war, dass Der Header Authorization ist in Tomcat für die Initialisierungsparameter cors.allowed.headers nicht zulässig. Also musste ich es nur so hinzufügen:

<filter> 
    <filter-name>CorsFilter</filter-name> 
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> 
    <init-param> 
     <param-name>cors.allowed.headers</param-name> 
     <param-value>Authorization,Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> 
     <!--   ^^^^^^^^^^^^^ --> 
    </init-param> 
</filter> 
Verwandte Themen