protected
def authorize
unless User.find_by_id(session[:user_id])
flash[:notice] = “eseguire login”
redirect_to :controller => ‘login’
end
end
ho provato tutte le varianti possibili sia su before_filter che su
redirect_to.
Il redirect funziona peccato però che, quando vengo rediretto a login,
non vedo la pagina di login ma la pagina di errore “redirect loop” di
firefox.
non conosco questo plugin perchè uso authlogic e prima ancora usavo un
sistema che mi ero scritto da solo, ad ogni modo l’errore sembra quel
filter:
dove l’hai messo? “before_filter :authorize, except => :sessions”
indicherebbe che “sessions” è una action, mentre mi sembra di capire che
è un controller.
di norma faccio questo:
nell’application controller metto un filtro “senza eccezioni”, poi nel
controller che non voglio filtrare (come ad esempio l’azione del login),
uso qualcosa tipo:
Per quanto riguarda il redirect, devi evitare il filtro “authorize”
sull’azione del login (/sessions/new) altrimenti è normale che vada in
loop (gli stai dicendo redirigere verso il login, ed il filtro sul login
dice di redirezionare comunque su se stesso).
nell’application controller metto un filtro “senza eccezioni”, poi nel
controller che non voglio filtrare (come ad esempio l’azione del login),
uso qualcosa tipo:
Per quanto riguarda il redirect, devi evitare il filtro “authorize”
sull’azione del login (/sessions/new) altrimenti � normale che vada in
loop (gli stai dicendo redirigere verso il login, ed il filtro sul login
dice di redirezionare comunque su se stesso).
spero di averti aiutato
A.
Ho risolto nel modo da te suggerito.
Ho inserito un before_filter authorize nell’application controller, ho
modificato il redirect in questo modo:
mettendolo in un controller, filtri solo quello quando si tratta di filtrare (potremmo parlare anche di un firewall di rete, ad
esempio…), il più delle volte si preferisce l’approccio filtra tutto
tranne i casi specificati. in questo modo, nella peggiore ipotesi,
blocchi qualcosa che dovrebbe passare, ma almeno sei sicuro che non
sfuggano casi sensibili.
anche in Rails occorre valutare quanto e cosa filtrare.
presumibilmente, un’area protetta da login, difficilmente è composta da
un solo controller, pertanto è una buona scelta metterlo
nell’application_controller
ad esempio nel mio caso, per proteggere l’area di backend (/admin/*) ho
definito un application_controller nel namespace Admin
(app/controllers/admin/application_controller.rb):
mettendolo in un controller, filtri solo quello quando si tratta di filtrare (potremmo parlare anche di un firewall di rete, ad
esempio…), il pi� delle volte si preferisce l’approccio filtra tutto
tranne i casi specificati. in questo modo, nella peggiore ipotesi,
blocchi qualcosa che dovrebbe passare, ma almeno sei sicuro che non
sfuggano casi sensibili.
anche in Rails occorre valutare quanto e cosa filtrare.
presumibilmente, un’area protetta da login, difficilmente � composta da
un solo controller, pertanto � una buona scelta metterlo
nell’application_controller
ad esempio nel mio caso, per proteggere l’area di backend (/admin/*) ho
definito un application_controller nel namespace Admin
(app/controllers/admin/application_controller.rb):
in questo modo ho potuto usare un before_filter per tutti i controllers
contenuti nel namespace
ciao,
A.
Michele C. ha scritto:
Concordo con te. Meglio filtrare tutto e gestire le eccezioni.
L’esempio che ho scritto era per mostrare la semplicità del redirect in
caso di accesso non autorizzato, senza la necessità di scrivere funzioni
personalizzate.
Ho capito la causa. E’ restful-authentication-i18n
Ho creato un progetto “pippo”. Mi son creato un controller e ho fatto
una view index
Inserendo il codice in quella vista tutto bene, il mese mi esce scritto
in inglese (en).
Ho installato il plugin e … non ha più funzionato!!! La lingua è
en_US!
mettendolo in un controller, filtri solo quello quando si tratta di filtrare (potremmo parlare anche di un firewall di rete, ad
esempio…), il pi� delle volte si preferisce l’approccio filtra tutto
tranne i casi specificati. in questo modo, nella peggiore ipotesi,
blocchi qualcosa che dovrebbe passare, ma almeno sei sicuro che non
sfuggano casi sensibili.
anche in Rails occorre valutare quanto e cosa filtrare.
presumibilmente, un’area protetta da login, difficilmente � composta da
un solo controller, pertanto � una buona scelta metterlo
nell’application_controller
ad esempio nel mio caso, per proteggere l’area di backend (/admin/*) ho
definito un application_controller nel namespace Admin
(app/controllers/admin/application_controller.rb):
Come non detto… mi stavo perdendo in un bicchere d’acqua. Per i poveri
neofiti come me posto la soluzione completa alla quale sono arrivato:
se vogliamo ereditare i metodi (ad esempio quelli per l’autenticazione)
di application_controller.rb genrale, che risiede cioè in
app/controllers possiamo fare così:
app/controllers/application_controller.rb:
class ApplicationController < ActionController::Base
#…
end
app/controllers/admin/application_controller.rb:
class Admin::ApplicationController < ApplicationController
#…
end
app/controllers/admin/foo_controller.rb:
class Admin::FooController < Admin::ApplicationController
#…
end
…magari era scontato ma io ci ho smanettato un paio d’ore per venirne
a capo ;o)