我正忙着将一个非常小的Web应用程序从ASP.NET MVC 2移植到Ruby / Sinatra。
在MVC应用程序中,当用户登录对数据库进行了正确验证时,FormsAuthentication.SetAuthCookie用于设置持久性cookie。
我想知道在Sinatra中相应的Forms身份验证是什么?所有的身份验证框架看起来都非常笨重,并不是我真正想要的。
答案 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)
我已经找到了这个教程和存储库的完整示例,它对我来说很好用
答案 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中保持不变。随着它添加到我的主文件中,它们会按预期持续存在。