ruby on rails 3关于before_filter的问题

时间:2010-07-16 17:01:18

标签: ruby-on-rails

有人可以帮我解释一下这里发生了什么吗?

我觉得文档没有提到很多或描述正在发生的事情。它只是说像这样使用这种方法。

如果用户名和密码为真,将会发生什么,如果为false会发生什么?

class AdminController < ApplicationController
  USERNAME, PASSWORD = "humbaba", "5baa61e4"

  before_filter :authenticate

  private

  def authenticate
    authenticate_or_request_with_http_basic do |username, password|
      username == USERNAME &&
      Digest::SHA1.hexdigest(password) == PASSWORD
    end
  end
end

感谢

2 个答案:

答案 0 :(得分:2)

before_filter方法可确保在所有请求之前运行私有方法authenticate

authenticate_or_request_with_http_basic会弹出浏览器的“输入您的用户名和密码”框,并在这种情况下将其传递到阻止区,usernamepassword

如果块返回true(如果用户名和密码匹配),请求将继续执行更具体的代码。如果块返回false(用户名和密码不匹配),请求将被缩短,并返回具有正确HTTP状态代码的身份验证失败页面。在显示失败页面之前,浏览器可能会再次重试该请求。

答案 1 :(得分:1)

每个浏览器都内置了标准身份验证功能,称为“基本HTTP身份验证”。我确定您已经在网页上看到了一个通用的用户名/密码对话框(作为操作系统的一部分)。就是这样。

它的工作原理如下:

  • 浏览器发送受保护网址的GET请求
  • 服务器发送401响应,表示“需要授权”
  • 浏览器知道它的含义,并使用用户/通过字段向用户弹出一个对话框
  • 当用户提交时,浏览器发送另一个GET请求,但使用包含base64编码的用户名和密码的Authorization标头
  • 服务器检查,如果成功 - 使用所请求页面的内容发回200成功响应

在你的before_filter中,当你在任何地方访问任何控制器动作时,你只是告诉Rails执行上述所有歌曲和舞蹈。 Rails为您处理上述所有协议通信。

如果拒绝访问,Rails会发回403 Forbidden响应,浏览器有内置的方式来显示。

了解更多信息:http://en.wikipedia.org/wiki/Basic_access_authentication