我正忙着将一个非常小的Web应用程序从ASP.NET MVC 2转移到Ruby/Sinatra。
在MVC应用程序中,使用FormsAuthentication.SetAuthCookie来在用户登录正确验证通过后设置一个持久化cookie。
我想知道Sinatra中Forms Authentication的等效物是什么?所有身份验证框架似乎都非常笨重,不是我所需要的。
我正忙着将一个非常小的Web应用程序从ASP.NET MVC 2转移到Ruby/Sinatra。
在MVC应用程序中,使用FormsAuthentication.SetAuthCookie来在用户登录正确验证通过后设置一个持久化cookie。
我想知道Sinatra中Forms Authentication的等效物是什么?所有身份验证框架似乎都非常笨重,不是我所需要的。
这是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。(动态调用这样的辅助程序,可以轻松地添加其他类型的用户,具有不同的特权。)before
处理程序为每个请求设置一个@user
实例变量,以便在显示每个页面顶部的用户名称等内容时使用。您还可以在视图中使用is_user?
辅助函数来确定用户是否已登录。Todd的答案对我无效,我在Sinatra的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
我认为我应该分享一下,以防有人遇到此问题并需要一个非持久化的解决方案。
App.run!
在结尾,当然还需要实际实现User
类(负责凭证管理)。 - p4010我发现了这个包含完整示例的教程和代码库,对我来说它运行得很好。
我使用了被接受的答案来开发一个只有两个密码(一个是用户密码,一个是管理员密码)的应用程序。我创建了一个登录表单,用户输入密码(或者PIN码),并将其与我在Sinatra设置中设置的密码进行比较(一个用于管理员,一个用于用户)。然后根据用户输入的密码,将session[:current_user]设置为管理员或用户,并进行相应的授权。我甚至不需要一个用户模型。但我确实需要像这样做一些事情:
use Rack::Session::Cookie, :key => 'rack.session',
:domain => 'foo.com',
:path => '/',
:expire_after => 2592000, # In seconds
:secret => 'change_me'
如sinatra文档所述,为了使会话在Chrome中持久存在,需要在主文件中添加此代码。添加后,会话按预期进行持久化。
我发现JWT是我一直在寻找的简单、现代/安全的解决方案。OP提到了庞大的框架,所以为了参考,我下载了最新版本(2.2.3)的jwt gem标签,压缩后大小为73 KB,解压后大小为191 KB。看起来维护得很好,并且在GitHub上开源。
这里有一篇关于它的好博客文章,包含代码和逐步指南,适合初学者:https://auth0.com/blog/ruby-authentication-secure-rack-apps-with-jwt/