设计:如果用户未登录,如何在未经重定向的情况下返回401未经授权

时间:2019-03-06 21:45:50

标签: ruby-on-rails ruby devise

Rails版本:4.0.13

Devise版本:3.2.0

当用户尝试查看未经授权查看的页面时,我的应用程序会将其重定向到登录页面。

如果用户未登录,我想:

  1. 将用户重定向到新的URL,然后
  2. 返回空着的“ 401未经授权”响应

到目前为止,我试图像这样覆盖authenticate_user!

class BaseApiController < ActionController::Base
  before_filter :authenticate_user!

  def authenticate_user!
    head :unauthorized
  end
end

但是,尽管这确实会返回“ 401未经授权”,但它也会首先重定向到登录URL。

2 个答案:

答案 0 :(得分:1)

这是您要找的吗?

https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated

这仍然会重定向用户,尽管您可以控制该重定向的位置。

答案 1 :(得分:0)

以@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

您可以自定义respond以在某些情况下重定向,而在其他情况下则抛出401个情况。对于我的用例,以下内容就足够了:

class CustomFailure < Devise::FailureApp
  def respond
    if request.env['REQUEST_PATH'].start_with?('/api')
      http_auth
    else
      redirect
    end
  end
end

我不明白为什么覆盖authenticate_user!在这里不起作用。