Forum: Italian Ruby user group Redirect forzato in SSL

Posted by Iwan B. (1w4n)
on 2012-11-15 14:00
Ho un'applicazione Rails ospitata nella intranet aziendale, accessibile
in una directory 'rails_app_dir' (uno 'scope' dal punto di vista delle
regole di Routing):

https://intranet.azienda/  <-- la home della intranet
https://intranet.azienda/rails_app_dir  <-- la mia applicazione Rails

Il livello SSL viene gestito a livello aziendale da un reverse proxy,
qundi le richieste che arrivano sia al web server (Nginx) che alla mia
app Rails sono già in http.

Il problema è che tutte le redirect_to (es. redirect_to book) vengono
passate (costruite) in http, generando un errore.

Forzando mediante:
config.force_ssl = true

non risolve il problema perché comunque a Rails, anche dopo un
redirezionamento la richiesta arriva ancora in http, e questo genera un
loop di redirezionamenti...

Qualche idea?

Grazie mille,
Vi auguro una magnifica giornata,

iwan
Posted by Andrea Pavoni (apeacox)
on 2012-11-15 14:23
(Received via mailing list)
Il giorno 15/nov/2012, alle ore 14:00, Iwan B. <iwan.buetti@mac.com> ha 
scritto:

> Forzando mediante:
> config.force_ssl = true
>
> non risolve il problema perch comunque a Rails, anche dopo un
> redirezionamento la richiesta arriva ancora in http, e questo genera un
> loop di redirezionamenti...
>
> Qualche idea?


la prima che mi viene in mente  di non usare i *path helpers* tipo 
users_path, bens users_url. in questo modo le url generate dovrebbero 
contenere il prefisso https :-)

ciao,
A.




--
http://andreapavoni.com
Posted by Fabrizio Regini (freegenie)
on 2012-11-15 14:36
(Received via mailing list)
Quindi devi generare le URL in modo che usino HTTPS in uscita, ma devi 
accettare HTTP in entrata. Ho capito bene?

Forse  un problema che risolvi facendoti un middleware ad-hoc. E' anche 
facile da fare secondo me.
Tieni `config.force_ssl = false` e quando la URL esce gli cambi lo 
scheme ad https://

-f
Posted by Iwan Buetti (Guest)
on 2012-11-15 15:05
(Received via mailing list)
On 15/nov/2012, at 14:35, Fabrizio Regini wrote:

> Quindi devi generare le URL in modo che usino HTTPS in uscita, ma devi accettare 
HTTP in entrata. Ho capito bene?
>
Esatto

> Forse  un problema che risolvi facendoti un middleware ad-hoc. E' anche facile 
da fare secondo me.
> Tieni `config.force_ssl = false` e quando la URL esce gli cambi lo scheme ad 
https://
>

Mmmmh... e come?
Posted by Fabrizio Regini (freegenie)
on 2012-11-15 15:45
(Received via mailing list)
Effettivamente non  proprio banale, neanche trascendentale.
Il tuo problema sono URL dei redirect, visto che i path helpers stampano 
un path quindi lo schema da usare in quel caso viene interpretato dal 
browser.

Per i redirect, visto che si tratta di un header, puoi usare una cosa 
del genere:

https://github.com/rack/rack/blob/master/lib/rack/head.rb

con @app.call(env) passi la chiamata in basso nello stack, ispezioni gli 
header e se si tratta di un redirect cambi lo schema.

-f
Posted by Fabrizio Regini (freegenie)
on 2012-11-15 15:46
(Received via mailing list)
E' solo un esempio, te ne devi fare uno da te che fa quello che ti 
serve.
Posted by Riccardo Tacconi (rtacconi)
on 2012-11-15 16:01
per il redirect_to basta:

:protocol => 'https'

magari ti fai un helper method tipo:

redirect_to_ssl

ed usi solamente quello, oppure puoi fare l'overriding di redirect_to. 
Non credo che ci sia bisogno di

config.force_ssl = false
Posted by Andrea Reginato (reis)
on 2012-11-15 18:07
(Received via mailing list)
Riprendendo quanto dicono i ragazzi credo che la soluzione possa essere
suddivisa in due parti.

Primo. Utilizza gli _url helpers invece di _path helpers

resource_path(resource) # wrong
resource_url(resource)  # correct

Secondo. Setta https come protocollo predefinito nella generazione degli
url.

def default_url_options(options={})
 { :secure => true }
end

Facci sapere.


On Thu, Nov 15, 2012 at 4:01 PM, Riccardo Tacconi 
<rtacconi@gmail.com>wrote:

>
> config.force_ssl = false
>
> --
> Posted via http://www.ruby-forum.com/.
> _______________________________________________
> Ml mailing list
> Ml@lists.ruby-it.org
> http://lists.ruby-it.org/mailman/listinfo/ml
>



--
Andrea Reginato
Lelylan | reThink your house
http://lelylan.com
Posted by Andrea Reginato (reis)
on 2012-11-15 18:08
(Received via mailing list)
Dimenticavo, default_url_options pu stare dentro la classe
ApplicationController.


2012/11/15 Andrea Reginato <andrea.reginato@gmail.com>

>
>>
>>
> --
> Andrea Reginato
> Lelylan | reThink your house
> http://lelylan.com
>
>


--
Andrea Reginato
Lelylan | reThink your house
http://lelylan.com
Posted by Fabrizio Regini (freegenie)
on 2012-11-15 20:48
(Received via mailing list)
Giusto, soluzione migliore. Dovrebbe funzionare.
Il giorno 15/nov/2012 18:06, "Andrea Reginato" 
<andrea.reginato@gmail.com>
ha scritto:
Posted by Andrea Ranaldi (mdrew)
on 2012-11-15 21:42
Uso frequentemente utilizzare rails dietro ad un proxy https non mi
ricordo di aver avuto molti problemi...... Come reverse proxy uso
lighttpd ma non penso sia differente.

Per i link utilizzo _path in maniera che l'indirizzo sia riferito
all'url a cui e` connesso l'utente (indipendentemente che sia http o
https)

nel caso mi sia indispensabile utilizzare un url aggiungo :protocol =>
'https' al link

http://api.rubyonrails.org/classes/ActionView/Help...

A parte questo non mi ricordo altre difficolta.

Andrea
Posted by Iwan Buetti (Guest)
on 2012-12-17 11:41
(Received via mailing list)
Ho risolto mettendo:

def default_url_options(options={})
   { :protocol => (Rails.env=="production" ? "https://" : "http://") }
end

in application_controller.rb

Direttiva che purtroppo viene ignorata dalla gemma cancan...
Il tutto risolto aggiungendo, nel medesimo file, la seguente:

rescue_from CanCan::AccessDenied do |exception|
   redirect_to access_denied_path(:protocol => (Rails.env=="production" 
? "https://" : "http://"))
end

Grazie mille per l'aiuto.
Buone feste!

iwan
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.