1

アプリケーションで authlogic を使用しています。また、A/B テストのために分割しています。BasicAuthentication または認証なしの代わりに、認証に authlogic を使用する分割が必要です。

そこで、分割シナトラ アプリのミドルウェアとして認証クラスを設定しました。

Split::Dashboard.use SinatraAuthlogic

次に、これは次の authlogic ミドルウェアである必要があります。

class SinatraAuthlogic
  def initialize(app)
    @app = app
  end

  def call(env)
    if is_user_logged_in?
      puts @app.class
      response = @app.call env
    else
      response = Rack::Response.new
      response.redirect '/login'
      response.finish
    end
  end

private

  def is_user_logged_in?
    logged_in = UserSession.find && UserSession.find.user
  end
end

問題は、authlogic を使用するために is_user_logged_in に何を入力する必要があるかということです。

4

1 に答える 1

0

いくつか試した後、私はこの解決策を思いつきました:

class Authlogic::RackAdapter < Authlogic::ControllerAdapters::AbstractAdapter
  def initialize(env)
    request = Rack::Request.new(env)
    super(request)
    Authlogic::Session::Base.controller = self
  end
end

私のミドルウェア クラスでは、「is_user_logged_in?」を変更しました。これへの方法:

def is_user_logged_id?(env)
  begin
    adapter = Authlogic::RackAdapter.new(env)
    logged_in = UserSession.find && UserSession.find.user
    return true
  rescue Exception => e
    return false      
  end
end

このようにしてユーザーを見つけることができます...ただし、ユーザーがログインしていない場合、nilの場合は例外が発生したため、コード全体をレスキューブロックに入れました...

より良いアプローチは大歓迎です。

于 2012-11-20T09:00:52.420 に答える