什么是Sinatra / Rack的一个非常简单的authenticationscheme

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

在MVC应用程序中,FormsAuthentication.SetAuthCookie被用于在用户login对数据库正确validation时设置持久cookie。

我想知道在Sinatra中表单身份validation的等价物是什么? 所有的authentication框架看起来非常笨重,而不是我所期待的。

这是Sinatra的一个非常简单的validationscheme。

我会解释它是如何工作的。

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。 (像这样dynamic地调用助手可以简单地添加具有不同权限的其他types的用户。)

最后, before处理程序为每个请求设置@user实例variables,例如在每个页面的顶部显示用户的名字。 你也可以使用is_user? 助手在你的意见,以确定用户是否login。

Todd的答案对我来说不起作用,而且我发现在Sinatra的常见问题解答中,一次性的简单validation就更简单了:

 require 'rubygems' require 'sinatra' use Rack::Auth::Basic, "Restricted Area" do |username, password| [username, password] == ['admin', 'admin'] end get '/' do "You're welcome" end 

我想我会分享它,以防万一谁徘徊这个问题,需要一个非持久性的解决scheme。

我发现这个教程和存储库有一个完整的例子,它的工作对我很好

http://skli.se/2013/03/08/sinatra-warden-auth/
https://github.com/sklise/sinatra-warden-example

我用一个只有2个密码的应用程序的接受答案,一个用户和一个pipe理员。 我只是做了一个需要密码(或pin)的login表单,并将其与我在sinatra的设置(一个用于pipe理员,一个用户)中设置的一个相比较。 然后根据用户input的密码和相应的授权,将会话[:current_user]设置为pipe理员或用户。 我甚至不需要用户模型。 我不得不做这样的事情:

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

正如在sinatra文件中提到的那样,让会话保持在chrome中。 随着添加到我的主文件,他们坚持如预期。