4

在我的 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 保存插入的数据,所以接下来会执行过滤器但不会询问凭证。

我不知道凭据保存在哪里。.

4

1 回答 1

6

这就是方法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 标头的浏览器获取请求时,它无法判断这是在身份验证请求之后立即请求,还是这些是之前保留的标头。

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

于 2012-09-19T13:06:17.723 回答