2013-12-13 10 views
8

Ho un'app Grails che utilizza Spring Security Core in esecuzione su una macchina AWS dietro un bilanciatore del carico.Grails Spring Security reindirizza alla pagina di accesso utilizzando https

Il servizio di bilanciamento del carico decodifica le connessioni ssl e inoltra alla porta 8080 della nostra istanza aggiungendo intestazioni X-Forwarded-Proto appropriate.

Desidero che qualsiasi accesso diretto a una pagina protetta venga reindirizzato alla pagina di accesso utilizzando https.

Per esempio una richiesta https://myapp.com/private/page dovrebbe reindirizzare a https://myapp.com/login/auth

ho messo nel mio config.groovy:

grails.plugin.springsecurity.secureChannel.definition = [ 
    '/login/**':  'REQUIRES_SECURE_CHANNEL' 
] 

ma questo provoca un loop di reindirizzamento (codice HTTP 302) alla pagina http login (http://myapp.com/login/auth)

poi ho provato solo con:

grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true 
grails.plugin.springsecurity.auth.forceHttps = true 

ma questo provoca un redirect (codice HTTP 302) alla pagina http login (http://myapp.com/login/auth)

  1. Il problema è presentig solo con la messa a punto di produzione (la guerra schierato al Tomcat dietro il bilanciamento del carico).
  2. Se provo lo stesso config.groovy sulla mia macchina Loacal Dev, il reindirizzamento a https://myapp.com/login/auth avviene correttamente.
  3. ho cercato di specificare un httpsport diverso per la sicurezza primavera, ancora una volta funziona sulla mia macchina dev locale, ma è completamente ignorato in app schierato che continua il reindirizzamento a http

Nessuna fortuna agguato ai posti simili, qualsiasi idea?

risposta

4

Ho appena attraversato lo stesso scenario. Mi sono bloccato sugli https, poi i redirect, e ora va tutto bene. Utilizzare queste impostazioni Config.groovy:

grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true 
grails.plugin.springsecurity.portMapper.httpPort = 80 
grails.plugin.springsecurity.portMapper.httpsPort = 443 
grails.plugin.springsecurity.secureChannel.secureHeaderName = 'X-Forwarded-Proto' 
grails.plugin.springsecurity.secureChannel.secureHeaderValue = 'http' 
grails.plugin.springsecurity.secureChannel.insecureHeaderName = 'X-Forwarded-Proto' 
grails.plugin.springsecurity.secureChannel.insecureHeaderValue = 'https' 

Nota per coloro che non utilizzano springsecurity 2.0, è 'plug-in' e non 'plugin' senza la 's'.

mio carico beanstalk impostazioni di bilanciamento simile a questa (ho un CERT SSL installato, non lo diede a vedere):

enter image description here

Nelle impostazioni carico EC2 di bilanciamento assicurarsi che i vostri ascoltatori sono impostati a destra :

enter image description here

e infine nei gruppi di protezione EC2 assicurarsi che la EB accetta le richieste sulle porte 80 e 443 del ELB:

enter image description here

Nota che in nessuna parte nella mia messa a punto di qualsiasi cosa faccio mai riferisco porte 8080 o 8443, anche se questo è quello che uso sul mio localhost per il test. Qualcuno che legge questo può pensare di provare a usare quelle porte per risolvere i problemi. La mia configurazione non lo richiedeva.

+0

Grazie mille per il vostro aiuto ma senza fortuna! Ho riprodotto la stessa configurazione, spostato anche la porta interna a 80 ma reindirizza sempre a http ... Hai qualcosa in grails.plugin.springsecurity.secureChannel.definition? Qualche idea su come posso almeno debuggarlo? – Paull

+1

Non ho un valore impostato per secureChannel.definition. Hai impostato grails.serverURL per il tuo ambiente di produzione? È un'altra cosa che ha infranto la mia app, ma penso che fosse correlata alla creazione di cloudfront. Non ho eseguito il debug con i registri. Vorrei fare una modifica nel file di configurazione e caricare una nuova guerra, quindi passare attraverso ogni scenario utilizzando un browser per vedere cosa si è rotto. Poi farei una modifica e riprovo. – spock99

+0

Quale versione di sicurezza di primavera stai usando? – spock99

4

Ho anche Sto ospitando la mia app con Grails Primavera di sicurezza Nucleo 2.0 RC4 su AWS con https e un bilanciatore di carico, e grazie a spock99 (sopra) e Ravi L di AWS, ho capito di lavoro.

ho fatto quanto segue in config.groovy:

// Required because user auth uses absolute redirects 
    grails.serverURL = "http://example.com" 

    grails.plugin.springsecurity.secureChannel.definition = [ 
     '/assets/**':  'ANY_CHANNEL',// make js, css, images available to logged out pages 
     '/**':   'REQUIRES_SECURE_CHANNEL', 
    ] 

    // overriding values in DefaultSecurityConfig.groovy from the SpringSecurityCore 2.0-RC4 
    grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true 
    grails.plugin.springsecurity.portMapper.httpPort = 80 
    grails.plugin.springsecurity.portMapper.httpsPort = 443 

Nota: Le seguenti non sono stati necessari nella Primavera di sicurezza Nucleo 2.0 RC4 - sono già in DefaultSecurityConfig.groovy

secureHeaderName = 'X-Forwarded-Proto' 
    secureHeaderValue = 'http' 
    insecureHeaderName = 'X-Forwarded-Proto' 
    insecureHeaderValue = 'https' 

I stava ottenendo false letture "non salutari" perché premendo "/" restituisce un reindirizzamento 302 a/login/auth, quindi ho aggiunto un metodo health() a HomeController (che ho mappato a "/ health") per colpire AWS:

class HomeController { 
     @Secured('IS_AUTHENTICATED_FULLY') 
     def index() { } 

     @Secured('permitAll') 
     def health() { render '' } 
    } 

La chiave per me era che i cookie di sessione non venivano gestiti correttamente con più istanze in esecuzione su Load Balancer (non l'ho scoperto fino all'impostazione dell'istanza minima su 2), quindi per consentire agli utenti di accedere e rimanere connesso, ho fatto quanto segue su AWS:

1. At Services/Elastic Beanstalk/Configuration/Load Balancing 
    a. set Application health check URL: /health 
    b. left Session Stickiness: unchecked 
2. At Services/EC2/Load Balancers/Description/Port Configuration: 
    For both port 80 (HTTP) and 443 (HTTPS) 
     1. Edit and select 'Enable Application Generated Cookie Stickiness' 
     2. Cookie Name: JSESSIONID 
1

ho affrontato problema simile in ambiente simile in cui il front-end era su https e dietro il server graal firewall era su http. Quando la sessione è scaduta, ajax e angolare $ http utilizzati per ottenere un messaggio di reindirizzamento su http://myclient.com/myWar/login/auth. Questa richiesta di reindirizzamento è stata utilizzata per causare l'accesso negato nel browser perché l'URL originale era https e il contenuto misto era disabilitato. Ero abituato a ricevere SCRIPT7002: XMLHttpRequest: Errore di rete 0x80700013, Impossibile completare l'operazione a causa dell'errore 80700013. " Questo errore si verificava solo nella produzione e non nell'ambiente di test.

La correzione è semplice, è sufficiente aggiungere quanto segue al file di configurazione. grails.serverURL = "https://mywebsitespublicaddress.com/myWar"

Problemi correlati