Devise with Sinatra

你。 提交于 2019-12-03 11:11:13

问题


Does anyone had installed Devise gem with Sinatra?

Devise is based on Warden and so it should work on Sinatra, I couldn't find any related info about how to implement it.


回答1:


Devise is really just a Rails-centric wrapper with nice helpers for warden, which is the underlying Rack authentication framework. So if you're using Sinatra in conjunction with Rails, you can use Devise in your Rails app, and use warden directly in your Sinatra app, and they will see the same user session data.

So no, you can't use Devise directly within your Sinatra app, but if you're building a modular app with some pieces in Rails, and other pieces in Sinatra, you can use Devise/Warden among the components.




回答2:


Devise is designed for Rails only. You can't use it with Sinatra.

You can check out:

https://github.com/maxjustus/sinatra-authentication

http://www.gittr.com/index.php/archive/sinatra-basic-authentication-selectively-applied/

https://gist.github.com/243611




回答3:


There is also https://github.com/jsmestad/sinatra_warden available.




回答4:


I was able to get it working. There were a few main aspects:

  1. Get Devise working with Rails (Devise is a Rails app, won't work without it)
  2. Setup the mapping (route) on Rack level to support both Rails and Sinatra
  3. Share the sessions between Rails and Sinatra
  4. Setup Warden and make it available to Sinatra

Here is most relevant part of code from /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

See, http://labnote.beedesk.com/sinatra-warden-rails-devise for a complete solution.



来源:https://stackoverflow.com/questions/4842074/devise-with-sinatra

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!