实现Rails令牌身份验证时,奇怪的ruby会阻止行为

时间:2013-12-24 03:54:10

标签: ruby-on-rails ruby

在尝试在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 

这怎么可能?

1 个答案:

答案 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