Devise login con i modelli di utente o amministratore e sottodomini stile Basecamp
-
26-09-2019 - |
Domanda
Non ho modelli separati per gli utenti elaborare e amministratori. Sono anche utilizzando Basecamp sottodomini di stile. Tutto funziona bene, tranne per un paio di controllori e le azioni in cui ho bisogno di essere in grado di autenticare sia come utente o come amministratore.
Attualmente ho authenticate_user! insieme a mio application_controller.rb e sto saltando con skip_before_filter per quei controller e le azioni che solo gli amministratori dovrebbero avere accesso.
Purtroppo non posso specificare semplicemente il requisito di autenticazione su ciascun controller, come mi sarà ancora bisogno di alcuni controller e l'azione per essere l'accesso sia da un utente o un amministratore.
Ho provato un paio di cose senza alcun risultato. Sembra che se sposto l'authenticate_user! e authenticate_admin! in una sorta di logica di rilevamento sottodominio omette di processo. In sostanza:
current_subdomain = request.subdomains.first
if current_subdomain == 'admin'
authenticate_admin!
else
authenticate_user!
end
Sono stato, ad un certo punto, in grado di farlo per tentare l'autenticazione, ma per qualche motivo non riusciva a tranne il controller della sessione dal bisogno di autenticazione che ha portato in un loop di reindirizzamento (prima volta per me con Ruby!).
Mi rendo conto che avrei potuto aggiungere un campo al mio utente che denota lo stato di amministrazione, ma l'applicazione richiede una maggiore separazione dei poteri tra l'utente e di amministrazione rispetto che consentirà, ad eccezione di alcuni controllori e le azioni.
- Rubino 1.9.2
- Rails 3.0.3
- Devise 1.1.3
Soluzione
Prova a scrivere il proprio prima del filtro lungo le linee di
#application_controller.rb
def authenticate_any!
if admin_signed_in?
true
else
authenticate_user!
end
end
poi nel controller in cui si desidera sia amministratori e utenti di essere in grado di avere accesso attraverso l'uso di autenticazione
#myobject_controller.rb
before_filter :authenticate_any!
Se hai effettuato l'accesso come amministratore, allora si passa il before_filter, altrimenti si passerà attraverso authenticate_user! che è il comportamento predefinito.
Altri suggerimenti
In realtà questo non funziona:
#application_controller.rb
def authenticate_any!
if admin_signed_in?
true
else
authenticate_user!
end
end
Si inizierà una ricorsione infinita sull'utente Autentica ..
Prova a modificare:
def authenticate_user!
return if admin_signed_in?
super
end
Basta ricordare che con questa seconda soluzione che stai dicendo qualcosa di simile a questo: 'È necessario effettuare l'accesso come, almeno, l'utente' e si perde l'autenticazione di soli utenti.
Gli amministratori saranno in grado di accedere a tutto.
Forse si dovrebbe prendere in considerazione ulteriore gioiello - CanCan ai ruoli maniglia
bello Piuttosto descritto qui: http://www.tonyamoyal.com/2010/09/29/rails-authentication-with-devise-and-cancan-part-2-restful-resources-for-administrators/