Rails:仅限管理员维护模式

时间:2011-07-13 05:00:39

标签: ruby-on-rails ruby-on-rails-3 authorization maintenance

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

  1. 我在应用中进行了一些更改,这些更改最适合使用应用内界面而不是控制台。

  2. 主持人无法访问控制台,但绝对可以帮助我们完成维护任务。

  3. 您如何推荐这样做?我一直在尝试设置一个环境变量ADMIN_MODE并在它变为真时更改所有权限,但这看起来非常狡猾和缓慢。

    我正在使用CanCan和Devise,这是值得的,但我绝对愿意接受任何建议。

    谢谢!

3 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:3)

我认为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]

答案 2 :(得分:0)

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

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

Fyi,我使用activeadmin作为我的管理页面。希望这有助于2015年的某些人。

相关问题