2010-07-16 99 views
1

难道有人请为我解释这里发生了什么?ruby​​ on rails 3关于before_filter的问题

我觉得文档没有提及很多或描述发生了什么。它只是说这样使用这种方法。

如果用户名和密码为true,会发生什么情况,如果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

before_filter方法确保私有方法authenticate是所有请求之前运行。

authenticate_or_request_with_http_basic弹出浏览器的“输入您的用户名和密码”框,并将它们传递到块中,如usernamepassword,在这种情况下。

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

+0

“弹出的浏览器‘中输入您的用户名和密码’框”。我不太明白这一点。它会创建一个用户在信息中键入的框?在哪里以及如何?如果返回false,将显示哪个页面?有关详细信息的信息如此之少:/ – 2010-07-16 17:10:38

+2

有一个[标准协议](http://en.wikipedia.org/wiki/Basic_access_authentication)用于通过HTTP进行身份验证。浏览器会在网页上方弹出自己的用户名和密码框。我不确定Rails为认证失败页面返回的内容,但它可能是非常通用的。你有没有试过运行这个代码,但看到它的行动?这是理解的最佳方式。 – Matchu 2010-07-16 17:14:08

+1

[这里是一个演示,告诉你登录界面会是什么样的。](http://www.pagetutor.com/keeper/http_authentication/index.html)虽然你可能不应该将它用于公共Web应用程序,因为普通用户并不完全熟悉它。 – Matchu 2010-07-16 17:15:19

1

标准认证功能内置于每个浏览器中,称为“基本HTTP认证”。我相信你已经看到了一个通用的用户名/密码对话框(作为你的操作系统的一部分)显示在网页上。就是这个。

其工作原理如下:

  • 浏览器发送GET一个受保护的URL
  • 服务器发送401响应,这意味着“需要授权”
  • 浏览器知道这意味着什么,会弹出一个对话框,要求给用户的用户名/密码
  • 当用户提交时,浏览器发送另一个GET请求,但是带有包含base64编码用户名和密码的授权头
  • Se rver检查,如果成功的话 - 发回用请求的页面

的内容在你before_filter你只是告诉Rails的执行上述所有的歌曲和舞蹈时,访问的任何控制器动作200成功响应任何地方。 Rails处理上面描述的所有协议通信。

在拒绝访问的情况下,Rails发回403 Forbidden响应,并且浏览器具有内置的方式显示。

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

+0

很好的解释!谢谢! – 2010-07-16 19:14:19