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会保存插入的数据,因此接下来的几次过滤器将被执行,但凭据不会询问。
我不知道凭据保存在哪里。。
这是方法的方式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或存储在会话中的值以某种方式完成。
归档时间: |
|
查看次数: |
3996 次 |
最近记录: |