在尝试在Rails中实现令牌身份验证的过程中,我遇到了这种行为:
class AppController < ActionController::Base
before_filter :restrict_access
def restrict_access
authenticate_or_request_with_http_token do |token, options|
false
end
end
这将拒绝所有请求,如预期的那样。
但是,如果我将“false”更改为“return false”,则接受所有请求。
def restrict_access
authenticate_or_request_with_http_token do |token, options|
return false
end
end
这怎么可能?
答案 0 :(得分:1)
为了拒绝请求,before_filter
必须调用重定向或呈现。
现在这就是这个方法的样子:
# File actionpack/lib/action_controller/metal/http_authentication.rb, line 389
def authenticate_or_request_with_http_token(realm = "Application", &login_procedure)
authenticate_with_http_token(&login_procedure) || request_http_token_authentication(realm)
end
以及return false
在这里做的是在request_http_token_authentication
能够运行之前从方法(而不仅仅是块)过早地突破,这就是实际呈现403页面的方法,如下所示: http://apidock.com/rails/ActionController/HttpAuthentication/Token/authentication_request
所以你最终得到这样的东西:
return(false) || request_http_token_authentication(realm)
而不是:
false || request_http_token_authentication(realm)
这就是为什么你不应该在块中使用return
语句。
在此处查看更多内容:Using 'return' in a Ruby block