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

And*_*Vos 38 ruby forms-authentication sinatra

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

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

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

Tod*_*ell 76

这是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
Run Code Online (Sandbox Code Playgroud)

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

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

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


Ral*_*eon 30

Todd的答案对我不起作用,我在Sinatra的常见问题解答中找到了一个更简单的一次性简单验证解决方案:

require 'rubygems'
require 'sinatra'

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

get '/' do
    "You're welcome"
end
Run Code Online (Sandbox Code Playgroud)

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

  • 托德的答案不能按原样运作,因为它不完整,不是因为它是错的.相反,它是一个相当复杂和经过深思熟虑的解决方案,它最后缺少一个"App.run!",当然还有`User`类的实际实现(负责凭证管理) (3认同)

use*_*932 7

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

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

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

  • 第一个链接已死。似乎是这样的:https://sklise.com/2013/03/08/sinatra-warden-auth/是可行的方法。 (2认同)