我正忙着从ASP移植一个非常小的web应用程序.NET MVC 2到Ruby/Sinatra.
在MVC应用程序中,FormsAuthentication.SetAuthCookie用于设置持久cookie,当用户登录通过数据库验证时.
我想知道在西纳特拉,表单认证的类似功能是什么?所有的认证框架看起来都非常庞大,并不是我想要的.
我正忙着从ASP移植一个非常小的web应用程序.NET MVC 2到Ruby/Sinatra.
在MVC应用程序中,FormsAuthentication.SetAuthCookie用于设置持久cookie,当用户登录通过数据库验证时.
我想知道在西纳特拉,表单认证的类似功能是什么?所有的认证框架看起来都非常庞大,并不是我想要的.
下面是一个非常简单的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?
方法,该方法已定义为助手.根据会话是否包含有效的帐户id,该方法应返回true或false(这样动态调用helpers可以简化添加具有不同权限的其他类型用户的过程)
最后,before
处理程序 for each 请求设置一个@user
实例变量,比如在每个页面顶部显示用户名.您还可以在视图中使用is_user?
帮助器来确定用户是否已登录.