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文件夹以自定义维护页面。