Rotaie Errore di autorizzazione Plugin
-
20-09-2019 - |
Domanda
Sto cercando di ottenere il metodo di permit
a lavorare utilizzando il Rails-autorizzazione-plugin e Authlogic , e io continuo a correre in questo errore:
Quando provo:
class ApplicationController < ActionController::Base
...
before_filter permit 'admin'
...
ottengo questo:
Authorization::CannotObtainUserObject in HomeController#index
Couldn't find #current_user or @user, and nothing appropriate found in hash
Ora io ho il mio setup metodo current_user
, e funziona, perché ho usato un po 'ovunque altro nella mia app:
class ApplicationController < ActionController::Base
...
helper_method :current_user
private
def current_user_session
return @current_user_session if defined?(@current_user_session)
@current_user_session = UserSession.find
end
def current_user
return @current_user if defined?(@current_user)
@current_user = current_user_session && current_user_session.record
end
...
so anche che io ho gli utenti con i ruoli appropriati nel mio database, perché questo metodo funziona:
def require_admin
unless current_user.is_admin? || current_user.is_root?
flash[:warning] = 'You are not an administrator and cannot access this page.'
redirect_to root_path
end
end
posso far funzionare tutto se ho appena verifico il livello utente utilizzando questo:
before_filter :require_admin, :only => 'index'
... ma non dovrei essere in grado della stessa cosa in modo efficace con permit
e permit?
?
Qualsiasi aiuto sarebbe molto apprezzato. Fammi sapere se hai bisogno di vedere più codice e sarò felice di pubblicarlo. Non c'è davvero nulla su Google che io possa fare heads-o-code di ottenere per quanto riguarda questi due sistemi di lavorare con l'altro.
Soluzione
Va bene, penso che ho capito.
Come Jared ha giustamente osservato, il corretto utilizzo è
permit 'admin'
(non come parte di un before_filter
).
TUTTAVIA ...
... il :get_user_method
predefinito è impostato su #current_user
, che è quello che utilizza il plugin acts_as_authenticated
. Io, come osservato in precedenza, sto usando Authlogic, in cui ho il metodo definito come current_user
(senza il simbolo di cancelletto).
Quindi, avevo provato quanto segue:
permit 'admin', :get_user_method => current_user
solo per essere accolti da un messaggio di errore bel spiegando che non avevo tale variabile o un metodo. Quello che mi mancava, tuttavia, è che l'opzione hash prende una stringa , non una chiamata diretta al metodo !! (Errore stupido, lo so!)
permit 'admin', :get_user_method => 'current_user'
... sembra funzionare per me.
Mi piace Ruby e Rails, ma a volte la sua semplicità può essere una maledizione della propria; Vengo sempre posseduto dalle cose semplici. :)
Altri suggerimenti
Si utilizza il plugin in modo non corretto. Esso non deve essere collocato in un filtro prima.
A livello globale, è sufficiente dichiarare:
permit 'admin'
Questo è tutto.
Tutte le vostre azioni sarà cercare un oggetto o current_user @user e reindirizzare alla pagina di login, se non.
A livello per-action, lo si utilizza come un blocco:
def index
permit 'admin' do
@some_models = SomeModel.all
end
end