我正忙着从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?帮助器来确定用户是否已登录.

Ruby相关问答推荐

使用map DO使用嵌套数组重构对象数组

为什么 ruby​​ 获得证书信任链与 gnutls-cli 不同

Ruby:如何将两个返回值连接到一行中的两个字符串

带有索引的 Ruby `each_with_object`

我可以在 Ruby 2.x 中要求命名参数吗?

无法在 macos-10.15.6 上Bundle 安装 puma 4.3.5 或 gem puma 与 ruby​​-2.6.6

Rake 与 Thor 的自动化脚本?

group_by 在 rails by 2 或更多属性

文字数字中的下划线是什么意思?

如何在 Ruby 中遍历多行字符串?

Ruby全局匹配正则表达式?

判断字符串是否为空的Ruby方法?

是否可以使用 Ruby 读取文件的修改日期?

计算文件中的行数而不将整个文件读入内存?

如何计算Ruby日期的星期几?

将整个文本文件作为单个字符串读取的合理方法是什么?

我可以在 OS X v10.6.8 上升级到当前版本的 Ruby (2.2.3) 吗?

Ruby 类继承:什么是`<<`(双倍小于)?

如何在 Ruby 中实现回调?

如何使用 Ruby 删除回车?