rails authenticate_or_request_with_http_basic

Dab*_*idi 4 authentication ruby-on-rails basic-authentication

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

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

before_filter :request_confirm, :only => [:delete_device]
Run Code Online (Sandbox Code Playgroud)

过滤方法是:

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
Run Code Online (Sandbox Code Playgroud)

没关系,但是只有第一次,因为Rails会保存插入的数据,因此接下来的几次过滤器将被执行,但凭据不会询问。

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

khu*_*hka 5

这是方法的方式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
Run Code Online (Sandbox Code Playgroud)

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

因此,如果您需要对其进行多次测试,则可以关闭并重新打开浏览器。我相信仅使用这些方法就不可能对每个请求进行身份验证,因为当应用程序从浏览器获取带有Auth标头的请求时,它无法分辨出此请求是否是在身份验证请求之后立即发出的请求,还是这些是之前保留的标头。

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