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
È stato utile?

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/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top