我如何使用authlogic作为身份验证中间件,专门拆分sinatra应用程序?

时间:2012-11-17 17:59:28

标签: sinatra rack authlogic

我在我的应用程序中使用authlogic。 我也分开进行A / B测试。 我希望split能够使用authlogic进行身份验证,而不是使用BasicAuthentication或不进行身份验证。

所以我将我的身份验证类设置为split sinatra app的中间件:

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

问题是我应该在is_user_logged_in中添加什么才能使用authlogic?

1 个答案:

答案 0 :(得分: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

这样我就可以找到用户......但是当用户没有登录时,如果没有,我得到了一个例外,这就是为什么我把整个代码放在一个救援区......

欢迎任何更好的方法。