对于Sinatra / Rack来说,什么是非常简单的认证方案

时间:2010-08-24 18:38:16

标签: ruby forms-authentication sinatra

我正忙着将一个非常小的Web应用程序从ASP.NET MVC 2移植到Ruby / Sinatra。

在MVC应用程序中,当用户登录对数据库进行了正确验证时,FormsAuthentication.SetAuthCookie用于设置持久性cookie。

我想知道在Sinatra中相应的Forms身份验证是什么?所有的身份验证框架看起来都非常笨重,并不是我真正想要的。

4 个答案:

答案 0 :(得分:75)

这是Sinatra的一个非常简单的认证方案。

我将在下面解释它是如何运作的。

class App < Sinatra::Base
  set :sessions => true

  register do
    def auth (type)
      condition do
        redirect "/login" unless send("is_#{type}?")
      end
    end
  end

  helpers do
    def is_user?
      @user != nil
    end
  end

  before do
    @user = User.get(session[:user_id])
  end

  get "/" do
    "Hello, anonymous."
  end

  get "/protected", :auth => :user do
    "Hello, #{@user.name}."
  end

  post "/login" do
    session[:user_id] = User.authenticate(params).id
  end

  get "/logout" do
    session[:user_id] = nil
  end
end

对于您要保护的任何路线,请向其添加:auth => :user条件,如上面的/protected示例所示。这将调用auth方法,该方法通过condition为路径添加条件。

条件调用is_user?方法,该方法已被定义为帮助程序。该方法应返回true或false,具体取决于会话是否包含有效的帐户ID。 (像这样动态调用帮助程序可以很容易地添加具有不同权限的其他类型的用户。)

最后,before处理程序为每个请求设置一个@user实例变量,例如在每个页面的顶部显示用户名。您还可以在视图中使用is_user?帮助程序来确定用户是否已登录。

答案 1 :(得分:27)

Todd的回答对我不起作用,我在Sinatra's FAQ找到了一个更简单的一次性简单验证解决方案:

require 'rubygems'
require 'sinatra'

use Rack::Auth::Basic, "Restricted Area" do |username, password|
    [username, password] == ['admin', 'admin']  
end

get '/' do
    "You're welcome"
end

我想我会分享它,以防万一有人徘徊这个问题,需要一个非持久的解决方案。

答案 2 :(得分:6)

我已经找到了这个教程和存储库的完整示例,它对我来说很好用

https://sklise.com/2013/03/08/sinatra-warden-auth/

https://github.com/sklise/sinatra-warden-example

答案 3 :(得分:1)

我使用了一个只有2个密码的应用程序的接受答案,一个用于用户,一个用于管理员。我刚刚创建了一个登录表单,其中包含一个密码(或引脚),并将其与我在sinatra的设置中设置的一个(一个用于管理员,一个用于用户)。然后我根据用户输入和授权的密码将会话[:current_user]设置为admin或user。我甚至不需要用户模型。我必须做这样的事情:

use Rack::Session::Cookie, :key => 'rack.session',
                       :domain => 'foo.com',
                       :path => '/',
                       :expire_after => 2592000, # In seconds
                       :secret => 'change_me'

sinatra documentation中所述,让会话在Chrome中保持不变。随着它添加到我的主文件中,它们会按预期持续存在。