Ruby on rails 设计:如果用户未登录,如何在不重定向的情况下返回401 Unauthorized

Ruby on rails 设计:如果用户未登录,如何在不重定向的情况下返回401 Unauthorized,ruby-on-rails,ruby,devise,Ruby On Rails,Ruby,Devise,Rails版本:4.0.13 设计版本:3.2.0 当用户试图查看他们无权查看的页面时,我的应用程序会将他们重定向到登录页面 如果用户未登录,我希望: 不将用户重定向到新的URL和 返回带有空正文的“401未经授权”响应 到目前为止,我试图覆盖用户!像这样: 但是,虽然这会返回“401 Unauthorized”,但它也会首先重定向到登录URL。这就是您要查找的吗 这仍然会重定向用户,尽管您可以控制重定向的方向 这就是你要找的吗 这仍然会重定向用户,尽管您可以控制重定向的方向 根据@vinyl的

Rails版本:4.0.13

设计版本:3.2.0

当用户试图查看他们无权查看的页面时,我的应用程序会将他们重定向到登录页面

如果用户未登录,我希望:

不将用户重定向到新的URL和 返回带有空正文的“401未经授权”响应 到目前为止,我试图覆盖用户!像这样:


但是,虽然这会返回“401 Unauthorized”,但它也会首先重定向到登录URL。

这就是您要查找的吗


这仍然会重定向用户,尽管您可以控制重定向的方向

这就是你要找的吗


这仍然会重定向用户,尽管您可以控制重定向的方向

根据@vinyl的答案,如果用户未登录,以下内容将返回401而不重定向:

# lib/custom_failure.rb
class CustomFailure < Devise::FailureApp
  def respond
    http_auth
  end
end

# config/initializers/devise.rb
config.warden do |manager|
  manager.failure_app = CustomFailure
end

我不明白为什么要覆盖用户!此处不起作用。

根据@vinyl的答案,如果用户未登录,以下内容将返回401而不重定向:

# lib/custom_failure.rb
class CustomFailure < Devise::FailureApp
  def respond
    http_auth
  end
end

# config/initializers/devise.rb
config.warden do |manager|
  manager.failure_app = CustomFailure
end

我不明白为什么要覆盖用户!此处不起作用。

这看起来方向正确,但不足以解决我的问题。不过,我正在更仔细地调查。我很好奇,如果没有重定向,当用户尝试访问受身份验证保护的URL时,您希望用户看到/体验什么。您使用的是纯API代码库吗?不,有些路由是以/API/v1/开头的API路由,而其他路由是普通的Rails应用程序。如果用户未登录并尝试访问API路由,我希望他们看到401,而不是重定向到任何地方。这看起来方向正确,但不足以解决我的问题。不过,我正在更仔细地调查。我很好奇,如果没有重定向,当用户尝试访问受身份验证保护的URL时,您希望用户看到/体验什么。您使用的是纯API代码库吗?不,有些路由是以/API/v1/开头的API路由,而其他路由是普通的Rails应用程序。如果用户未登录并尝试访问API路由,我希望他们看到401,而不是重定向到任何地方。Rails 5.2和6.0不使用request.env['request_PATH']。在任何情况下,最好在可用时使用为ActionDispatch::Request提供的公共方法。尝试使用request.original_fullpath。以“/api”开头。Rails 5.2和6.0不使用request.env['request_PATH']。在任何情况下,最好在可用时使用为ActionDispatch::Request提供的公共方法。尝试使用request.original\u fullpath。以“/api”开头。
class CustomFailure < Devise::FailureApp
  def respond
    if request.env['REQUEST_PATH'].start_with?('/api')
      http_auth
    else
      redirect
    end
  end
end