2015-07-23 17 views
7

Sto utilizzando Tomcat 7. Ho impostato il filtro nativo CORS come suggerito nella documentazione Tomcat ufficiale.Filtro CORS Tomcat e Spring Security

Ho provato tutto ciò che potevo, ma non funziona. Dato che sto usando un'applicazione del fornitore che conosco sta usando i filtri Spring Security, mi chiedo se c'è un bug noto qui.

Ecco di cosa sto parlando:

<!-- 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 --> 

ho aggiunto le seguenti configurazioni per Web.xml:

<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> 

So che è minima, ma dovrebbe funzionare.

Ho anche provato in precedenza una versione più lunga:

<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> 

Non ha funzionato neanche.

Qualcuno ha esperienza con l'installazione di filtri CORS con Spring Security?

+2

Potresti essere più specifico su "non funziona"? – Djizeus

+0

qual è la tua versione esatta di tomcat? – salyh

+0

Hai provato a mettere il filtro cors davanti al filtro a molla? – user467257

risposta

0

il fornitore dell'applicazione deve essere abilitato a rispondere in entrata richieste di opzioni di preflight con l'intestazione CORS appropriata. Non è un bug, è solo una configurazione e/o alcune linee di codice che mancano a CORS abilitato per Spring. L'attivazione di CORS non è un grosso problema per il tuo fornitore, ma potrebbe diventare un grosso problema per te, specialmente se non hai una copia del progetto java delle tue applicazioni in eclissi.

Se si è fortunati che l'applicazione del fornitore funzioni già su Spring Framework 4.2 RC2, è possibile eseguire autonomamente la configurazione in XML, vedere https://spring.io/blog/2015/06/08/cors-support-in-spring-framework. Prova semplicemente ad aggiungere il blocco <mvc:cors> alle tue applicazioni web.xml e configura i valori in base alle tue esigenze. Non l'ho provato da solo, ma dovrebbe fare il trucco.

Ma temo potrebbe non essere così fortunati ...

Poi le cose diventano un po 'difficile se non si vuole chiedere il fornitore per aggiornato il/tuo file WAR dell'applicazione. In questo caso, dai un'occhiata a questo post: Can't set Authentication Header with Angular and Spring Security. La risposta nel post descrive la configurazione da eseguire nell'applicazione web.xml(creare un nuovo filtro CORS e associarlo a una classe che è necessario creare) e in che modo la classe di filtro java aggiuntiva (nell'esempio la classe è denominata SimpleCorsFilter nel pacchetto com.abcinsights.controller) deve apparire come farlo funzionare. Per aggiungere la nuova classe java alla tua applicazione, devi decomprimere WAR, creare e aggiungere la nuova classe filtro java (non dimenticare la dichiarazione del pacchetto all'interno della tua nuova classe java) e riconfezionarla. Questa è la parte più complicata, perché se hai commesso un errore nella tua classe o durante il riconfezionamento, probabilmente vedrai l'errore la prima volta dopo la nuova distribuzione.

-1

È necessario aggiungere il filtro CORS prima Filtro Primavera di sicurezza in web.xml

CORS OPZIONI richiesta HTTP non ha bisogno di essere trattati da Primavera di sicurezza

+0

bene, Mourad ha ragione. Ad alto livello questo è ciò che deve essere fatto. – mika

0

Potrei sbagliarmi.ma ogni file di configurazione che abbia mai visto avuto i nomi param diversa dalla vostra, forse questo è il problema, quello che ho sempre visto e fatto era:

<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

ho avuto una configurazione simile e il problema chiave è che l'intestazione Authorization non è consentita nei valori predefiniti di Tomcat per i parametri di inizializzazione cors.allowed.headers. Quindi dovevo aggiungerlo in questo modo:

<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> 
Problemi correlati