如何将应用程序置于维护模式,但仍然允许管理员/版主登录和使用站点



我想把我的应用程序进入维护模式,但仍然有管理员/版主能够登录和使用该网站。

两个原因:

  1. 我在应用程序中做了一些改变,最好使用应用程序内的界面,而不是控制台。

  2. 版主不能访问控制台,但绝对可以帮助我们完成前面的维护任务。

你建议怎么做呢?我一直在尝试设置一个环境变量ADMIN_MODE,并在它为真时更改所有权限,但这似乎相当模糊和缓慢。

我正在使用CanCan和design,但我绝对愿意接受任何建议。

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

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

我认为anobble的解决方案是好的,另一种方法可能是让你的web服务器做到这一点,我使用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]

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

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作为我的管理页面。

相关内容

  • 没有找到相关文章

最新更新