rails authenticate_or_request_with_http_basic

时间:2012-09-18 14:38:27

标签: ruby-on-rails authentication basic-authentication

在我的RoR应用程序中,我需要使用基本身份验证来保护页面,并且我希望每次用户链接到该页面时都会询问凭据。

所以我在操作之前添加了一个过滤器,如下所示:

before_filter :request_confirm, :only => [:delete_device]

,过滤方法是:

def request_confirm

  user = User.find_by_id(session[:user_id])

  authenticate_or_request_with_http_basic do |nick, pass| 
   nick == user.nickname and pass == user.password 
  end

end

没关系,但只是第一次因为rails保存插入的数据,所以以下时间过滤器将被执行,但凭证不会询问。

我不知道保存凭据的位置。 。

1 个答案:

答案 0 :(得分:4)

这是方法authenticate_or_request_with_http_basic以及HTTP身份验证的工作原理。 authenticate_or_request_with_http_basic可以改写为:“首先尝试进行身份验证,如果未经过身份验证,则请求身份验证”。该方法的源代码如下:

def authenticate_or_request_with_http_basic(realm = "Application", &login_procedure)
  authenticate_with_http_basic(&login_procedure) || request_http_basic_authentication(realm)
end

那会发生什么。当您第一次点击调用此操作的URL时,此authenticate_or_request_with_http_basic将返回HTTP响应401 Unauthorized。浏览器理解这是一个身份验证请求,并显示一个输入用户名和密码的对话框,然后重新发送相同URL的请求,但将您的凭据包含在请求标头中。您再次点击过滤器,此时方法authenticate_or_request_with_http_basic发现请求中存在身份验证标头并授权您成功。浏览器会在每个后续请求中将这些auth标头发送到此域(直到您关闭浏览器)。

因此,如果您需要多次测试,可以关闭并重新打开浏览器。我相信只使用这些方法就不可能在每个请求上请求身份验证和身份验证,因为当应用程序从具有Auth标头的浏览器获取请求时,它无法在身份验证请求之后立即判断这是否是请求,或者这些是之前保留的标头。 / p>

但这可以通过使用cookie或会话中存储的值以某种方式完成。