Rails4 + Devise:当用户未经过身份验证时“隐藏”路由

时间:2014-11-15 07:01:25

标签: ruby-on-rails devise warden

我正在尝试让我的管理员后台页面对于未经过身份验证的用户“隐身”。当用户访问类似/admin/my_controller的内容时,我希望显示404自定义页面,这让他相信这只是一个常规的404.当用户通过身份验证时,他会正确访问控制器。

所以我几乎所有的东西都在工作,我只是错过了设计/监护人的部分。我在我的Rails应用程序中正确配置了404错误救援(在名为ErrorsController的控制器中实现),所以当有人转到/nothing_here这样的非现有uri时,我的自定义404页面会正确显示。

我正在尝试将ErrorsController用作failure_app几乎完全正常工作,除非我使用不正确的凭据登录时收到异常。我当然只是错过了最后一个细节。例外是

AbstractController::ActionNotFound at /unauthenticated 
The action 'create' could not be found for ErrorsController

显然create操作应该从SessionController调用,而不是从ErrorsController调用。这是最后一点缺失的。怎么做到这一点?


自定义404配置

在config / application.rb

config.exceptions_app = self.routes

在config / routes.rb

get '*dummy', to: 'errors#index'

应用程序/控制器/ errors_controller.rb

class ErrorsController < ApplicationController
  def index
    display_404
  end
end

设计配置

在config / initializers / devise.rb

config.warden do |manager|
  manager.failure_app = ErrorsController
end

结果

  • 在未经过身份验证的情况下访问“admin”uri会正确显示我的自定义404页面
  • 使用具有正确凭据的设计登录按预期工作
  • 使用不正确的凭据登录会引发AbstractController::ActionNotFound at /unauthenticated The action 'create' could not be found for ErrorsController

1 个答案:

答案 0 :(得分:1)

在用户未登录时处理错误的更优雅方法是向应用程序控制器添加方法。例如display_404display_404方法中添加

raise ActionController::RoutingError.new('Not Found')

当调用此方法时,它将引发Rails&#39;自己的错误页面和日志&#39; Not Found&#39;在日志文件中。在开发中,这将在屏幕上显示,但是对于生产它只能在日志文件中找到,因此添加类似'User was not signed in'的内容是可能的。

然后使用

before_action do
  unless admin_signed_in?
    display_404
   end
end

访问者未登录时将显示错误页面。