繁体   English   中英

Rails4 + Devise:用户未通过身份验证时“隐藏”路线

[英]Rails4+Devise: “hide” routes when user is not authenticated

我试图使未经身份验证的用户的管理后台页面“不可见”。 这意味着当用户转到/admin/my_controller我想显示404自定义页面,使他相信这只是常规的404。当然,当用户通过身份验证后,他将正确访问控制器。

所以我几乎所有工作都在进行,我只是缺少设计/维护部分。 我在我的Rails应用程序中正确配置了404错误救援(在我名为ErrorsController的控制器中实现),因此当有人进入不存在的uri如/nothing_here ,我的自定义404页面会正确显示。

我正在尝试使用ErrorsController作为failure_app ,它几乎可以正常工作,除了如果我使用不正确的凭据登录会收到异常。 我当然只是错过了最后一个细节。 例外是

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

显然,应该从SessionController而不是ErrorsController调用create动作。 这是最后遗漏的一点。 如何实现呢?


自定义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

结果

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

当用户未登录时,处理错误的更合适的方法是将方法添加到应用程序控制器中。 例如display_404display_404方法中添加

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

调用此方法时,它将引发Rails的错误页面,并在日志文件中记录“未找到”。 在开发过程中,它将显示在屏幕上,但在生产过程中将仅在日志文件中找到,因此有可能添加'User was not signed in'内容。

然后使用

before_action do
  unless admin_signed_in?
    display_404
   end
end

如果访客未登录,将显示错误页面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM