rails authenticate_or_request_with_http_basic

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

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

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保存插入的数据,所以以下时间filter将被执行但凭证不会询问。

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

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

 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。 浏览器理解这是一个身份validation请求,并显示一个输入用户名和密码的对话框,然后重新发送相同URL的请求,但将您的凭据包含在请求标头中。 您再次点击filter,此时方法authenticate_or_request_with_http_basic看到请求中有身份validation标头并授权您成功。 浏览器会在每个后续请求中将这些auth标头发送到此域(直到您关闭浏览器)。

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

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