Restful authentication plugin problema con before_filter

Ciao a tutti.
Sto provando ad utlizzare il plugin in oggetto e, in particolare, sto
cercando di “forzare” il passaggio da “login” con un before_filter
nell’application controller.
“login” nel plugin in oggetto non é però un controller ma una rotta
verso sessions/new.
Il filter che ho creato é il seguente:

before_filter :authorize, except => :sessions

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.

Dove sto sbagliando?

Grazie a tutte le persone che mi risponderanno.

Ciao

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:

skip_before_filter :authorize, :only => [:new,:create]

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 :wink:
A.

pezzuya … ha scritto:

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:

skip_before_filter :authorize, :only => [:new,:create]

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 :wink:
A.

Ho risolto nel modo da te suggerito.
Ho inserito un before_filter authorize nell’application controller, ho
modificato il redirect in questo modo:

redirect_to :controller => ‘sessions’, :action => ‘new’

e ho inserito uno skip_before_authorize nel sessions controller

Grazie 1000 :slight_smile:

mettendolo in un controller, filtri solo quello :wink: 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 :slight_smile:

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

Admin::ApplicationController < ActionController::Base

in questo modo ho potuto usare un before_filter per tutti i controllers
contenuti nel namespace :wink:

ciao,
A.

Michele C. ha scritto:

Io ci stò giocando, con il plugin in oggetto.
nel controller (non nell’application_controller)ho messo un bel:

before_filter :login_required

e il gioco è fatto. Prima di farmi fare qualsiasi azione mi rimanda al
login.

Ciao Michele.

Andrea P. wrote:

mettendolo in un controller, filtri solo quello :wink: 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 :slight_smile:

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

Admin::ApplicationController < ActionController::Base

in questo modo ho potuto usare un before_filter per tutti i controllers
contenuti nel namespace :wink:

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.

Ciao Michele.

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!

Ciao Michele.

Andrea P. wrote:

mettendolo in un controller, filtri solo quello :wink: 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 :slight_smile:

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

Admin::ApplicationController < ActionController::Base

in questo modo ho potuto usare un before_filter per tutti i controllers
contenuti nel namespace :wink:

ciao,
A.

Michele C. ha scritto:

Ciao a tutti, sono un nuovo utente di qs forum nonché un neofita di
Rails.
Ho la medesima esigenza di restringere l’accesso ad una parte di admin,
ho provato la soluzione indicata ma sembra che
app/admin/application_controller.rb non venga minimamente preso in
considerazione cioè proprio non viene eseguito… qualsiasi cosa ci
inserisca dentro (non rileva nemmeno errori appositamente inseriti)…
cosa sbaglio?

Andrea

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)

Spero sia utile a qualcuno

Andrea

scusate … ho risposto pensando su questo post convinto di essere in un
altro|