2011-01-30 10 views
19

Qualcuno ha installato la gemma Devise con Sinatra?Devise with Sinatra

Devise è basato su Warden e quindi dovrebbe funzionare su Sinatra, non sono riuscito a trovare alcuna informazione correlata su come implementarlo.

+0

È piuttosto rails-centric: https://github.com/plataformatec/devise/blob/master/app/controllers/devise/confirmations_controller.rb – scragz

risposta

22

Devise è davvero involucro solo un Rails-centric con belle aiutanti per warden, che è il framework di autenticazione Rack sottostante . Quindi, se stai usando Sinatra insieme a Rails, puoi usare Devise nella tua app Rails e usare Warden direttamente nella tua app Sinatra, e vedranno gli stessi dati della sessione utente.

Quindi no, non è possibile utilizzare Devise direttamente all'interno dell'app Sinatra, ma se si sta costruendo un'app modulare con alcuni pezzi in Rails e altri pezzi in Sinatra, è possibile utilizzare Devise/Warden tra i componenti.

4

Sono riuscito a farlo funzionare. Ci sono stati alcuni aspetti principali:

  1. Get Devise lavorare con Rails (Devise è un'applicazione Rails, non funzionerà senza di essa)
  2. Imposta la mappatura (percorso) sul livello di rack per supportare entrambe le rotaie e Sinatra
  3. Condividi le sessioni tra le rotaie e Sinatra
  4. Setup Warden e renderlo disponibile per Sinatra

Ecco parte più rilevante di codice da /config.ru:

# 

    # ... 

    # Rest with Rails 
    map "/" do 
     run MyApp::Application 
    end 

    # Anything urls starting with /slim will go to Sinatra 
    map "/slim" do 

     # make sure :key and :secret be in-sync with initializers/secret_store.rb initializers/secret_token.rb 
     use Rack::Session::Cookie, :key => '<< see, initializers/secret_store.rb >>', :secret => '<< copy from initializers/secret_token.rb >>' 

     # Point Warden to the Sinatra App 
     use Warden::Manager do |manager| 
     manager.failure_app = AppMain 
     manager.default_scope = Devise.default_scope 
     end 

     # Borrowed from https://gist.github.com/217362 
     Warden::Manager.before_failure do |env, opts| 
     env['REQUEST_METHOD'] = "POST" 
     end 

     run AppMain 
    end 

Vedere, http://labnote.beedesk.com/sinatra-warden-rails-devise per una soluzione completa.

+0

Avresti dovuto sviluppare la tua app in Rails – AMBasra

+0

@AMBasra, Avevo bisogno di un framework più semplice per sviluppare un api CRUD, Sinatra sembrava un utensile delle giuste dimensioni per le attività. –

+0

Intendevo dire che stai usando il tuo server con la tua app. Quindi non è più leggero. Perché usare due framework se puoi fare tutto in uno. L'ambiente di produzione sarebbe anche in esecuzione sia su rotaia che su sinatra. – AMBasra