1

authenticate_or_request_with_http_basic当我在块的开头添加调用时,我有一个有效的控制器操作会中断。这是无效的操作代码:

def index
  authenticate_or_request_with_http_basic do |username, password|
    username == "test1" and password == "test"
  end

  render layout: false, content_type: 'application/xml'
end

我在浏览器窗口中收到“AbstractController::DoubleRenderError”错误响应,并带有以下消息:

在此操作中多次调用渲染和/或重定向。请注意,您只能调用渲染或重定向,并且每个操作最多调用一次。另请注意,重定向和渲染都不会终止操作的执行,因此如果您想在重定向后退出操作,则需要执行“redirect_to(...) and return”之类的操作。

当我将“authenticate_or_request_with_http_basic”逻辑放在一个单独的操作中,然后配置一个 before_filter 来为索引操作运行它时,一切都很好。但是,我不会将这个逻辑重用于索引以外的任何操作,我想知道为什么上面的代码不起作用。

解决方案

在 Tyler 和 RKB 的帮助下,我找到了解决方案。这里是:

authenticated = authenticate_or_request_with_http_basic "Authentication Required" do |username, password|
  @user = User.find_by_username(username)
  @user != nil && password == "test"
end
return unless authenticated == true 

authenticate_or_request_with_http_basic如果身份验证成功,则返回“true”。失败时返回 401。

4

2 回答 2

1

听起来 authenticate_or_request_with_http_basic 要么呈现要么重定向。我猜当你将它移动到 before_filter 时它会起作用,因为它返回 false 取消回调链并导致第二次渲染不发生?只是猜测...

于 2011-12-22T20:01:43.473 回答
1

authenticate_or_request_with_http_basic 调用 render 以发送执行 HTTP 基本身份验证所需的 HTTP 响应(状态代码 401 未授权)。有关详细信息,请参阅Rails 代码

于 2011-12-22T20:02:50.890 回答