2

Sinatra Rack アプリを作成していて、認証に Warden を使用したいと考えています。私はherokuのツールベルトを使用しているので、アプリを実行するためにフォアマンを使用しています。これを機能させると思われるコードをいくつか見つけました。残念ながら、実際に Warden env オブジェクトにアクセスしようとすると、nil になります。

sinatra_warden gemを使用しようとしましたが、独自のバグもあります (これに関連している可能性があります)。

config.ru:

require './web.rb'
use Rack::Static, :urls => ["/css", "/img", "/js"], :root => "public"
run MyApp

web.rb:

require 'sinatra'
require 'warden'
require 'data_mapper'

require './config/datamapper.rb'
require './config/warden.rb' # I've tried this inside of MyApp, still didn't work

class MyApp < Sinatra::Base

  get '/test' do
    env['warden'].authenticate! # env['warden'] is nil :(
  end

end

config/warden.rb:

use Rack::Session::Cookie, :secret => ENV['SESSION_SECRET']

use Warden::Manager do |manager|
  manager.default_strategies :password
  manager.failure_app = MyApp.new
end

Warden::Manager.serialize_into_session { |user| user.id }
Warden::Manager.serialize_from_session { |id| User.get(id) }

Warden::Manager.before_failure do |env,opts|
  # Sinatra is very sensitive to the request method
  # since authentication could fail on any type of method, we need
  # to set it for the failure app so it is routed to the correct block
  env['REQUEST_METHOD'] = "POST"
end

Warden::Strategies.add(:password) do
  def valid?
    params["email"] || params["password"]
  end

  def authenticate!
    u = User.authenticate(params["email"], params["password"])
    u.nil? ? fail!("Could not log in") : success!(u)
  end
end

バージョン:

  • シナトラ: 1.1.0
  • ウォーデン: 1.2.1
  • ラック: 1.4.1
  • ルビー: 1.9.3p194
  • 職長: 0.60.0

私が説明したセットアップで Warden を使用する方法について何かアイデアはありますか?

(PS好奇心から、env変数とは正確には何ですか?)

4

2 に答える 2

4

Rack は内部でRack::Builderクラスを使用して config.ru ファイルを解析し、ディレクティブをラップしてミドルウェア コンポーネントを構築します。

ビルダーの呼び出しが無視さuseれていると思います。config/warden.rbそのファイルからディレクティブを削除し、それらを のミドルウェア スタックに追加するとうまくいく場合がありますconfig.ru

require './web.rb'

use Rack::Session::Cookie, :secret => ENV['SESSION_SECRET']

use Warden::Manager do |manager|
  manager.default_strategies :password
  manager.failure_app = MyApp.new
end

use Rack::Static, :urls => ["/css", "/img", "/js"], :root => "public"

run MyApp
于 2012-11-06T03:49:45.810 に答える