Rails:仅管理员维护模式

Posted

技术标签:

【中文标题】Rails:仅管理员维护模式【英文标题】:Rails: admin-only maintenance mode 【发布时间】:2011-07-13 05:00:38 【问题描述】:

我想将我的应用程序置于维护模式,但仍然有管理员/版主能够登录并使用该网站。两个原因:

    我正在应用内进行一些更改,这些更改最好使用应用内界面而不是控制台应用。

    版主无法访问控制台,但绝对可以帮助我们完成摆在我们面前的维护任务。

您会如何建议这样做?我一直在尝试设置一个环境变量 ADMIN_MODE 并在它为 true 时更改所有权限,但这似乎非常笨拙和缓慢。

我正在使用 CanCan 和 Devise,因为它物有所值,但我绝对愿意接受任何建议。

谢谢!

【问题讨论】:

【参考方案1】:

这可能是一个相当简单的解决方案:

class ApplicationController < ActionController::Base
  before_filter :check_admin_mode

  protected

  def check_admin_mode
    if ENV['ADMIN_MODE'] && controller_name != 'sessions' && !current_user.admin?
      redirect_to '/maintenance.html'
    end
  end
end

【讨论】:

这看起来不错——我遇到的唯一问题是我仍然需要能够让版主/管理员登录,以防在启用维护模式时他们的会话过期。似乎这会阻止尚未登录的任何人成功登录。关于如何保持登录操作打开的任何建议? 我已经更新了代码,检查是否排除了 Sessions 控制器,如果您使用的是 Devise,这应该是正确的。 好的,这行得通。唯一缺少的是您必须检查current_user 是否存在,否则当 current_user 为 nil 时,检查当前用户是否为管理员将失败。但这很有效,而且比我单独使用 CanCan 快得多。谢谢!!【参考方案2】:

我认为 aNoble 的解决方案很好,另一种方法可能是让您的网络服务器执行此操作,我使用 Capistrano 的 cap deploy:web:disable 任务然后 mod_rewrite 有条件地重定向到维护页面或允许特定用户通过 IP 地址,但您可以编写自己的条件。

# Redirect to system maintenance if exists - used by cap deploy:web:disable
RewriteCond %REQUEST_URI !\.(css|jpg|png|gif)$
RewriteCond %DOCUMENT_ROOT/system/maintenance.php -f 
# Allow me through
RewriteCond %REMOTE_ADDR "!^XXX\.XXX\.XXX\.XXX"
RewriteCond %SCRIPT_FILENAME !maintenance.php [NC]
RewriteRule ^.*$ /system/maintenance.php [L]

【讨论】:

这是个好主意,谢谢保罗。我在 Heroku,所以我没有 mod_rewrite 功能,但这是一个很好的技术,在未来的其他部署中要牢记。【参考方案3】:

我做了类似的事情,可能对仍然感兴趣的人有用

class ApplicationController < ActionController::Base
  before_filter :check_maintenance_mode

  protected

  def check_maintenance_mode

    temp_var = self.class.to_s.split("::").first

    return if temp_var.casecmp("admin") == 0 || temp_var.casecmp("activeadmin") == 0

    if site_setting.maintenance_mode
      redirect_to maintenance_path unless request.fullpath.include?(maintenance_path)
    else
      redirect_to root_path if request.fullpath.include?(maintenance_path)
    end

  end

end

首先,我所做的是拆分类名以获取我正在访问的模块名称或控制器名称,如果我进入管理区域,我将从方法中退出。您不希望维护页面影响管理模块

其次,我检查维护模式,如果是真的,我会将用户重定向到维护页面,除非他们已经在页面本身上。如果未开启维护模式,用户将被重定向回 root_path

仅供参考,我使用 activeadmin 作为我的管理页面。希望这对 2015 年的人有所帮助。

【讨论】:

以上是关于Rails:仅管理员维护模式的主要内容,如果未能解决你的问题,请参考以下文章

text 如果用户未登录,则仅显示维护模式。将maintenance.php文件添加到wp-content文件夹以自定义维护页面。

在asp.net核心中实现“维护模式”

drupal 7.34 维护模式

如何在已建立的网站上实施“维护模式”

Wordpress:网站一部分的维护模式

如何仅列出属于我的 Rails 应用程序的 Rake 任务(没有不可维护的 grep 语句)?