如何在 Rails 上禁用“无法从... 渲染控制台”

我使用 Ubuntu/vasrant 作为我的开发环境。 我在轨道控制台收到这些信息:

Started GET "/assets/home-fcec5b5a277ac7c20cc9f45a209a3bcd.js?body=1" for 10.0.2.2 at 2015-04-02 15:48:31 +0000
Cannot render console from 10.0.2.2! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255

是否有可能禁用那些“无法呈现...”的消息或以任何方式允许它们?

94957 次浏览

您需要在 Web Console 配置中明确允许10.0.2.2网络空间。

所以你会想要这样的东西:

class Application < Rails::Application
config.web_console.permissions = '10.0.2.2'
end

阅读 给你了解更多信息。

作为 指出守护者,这要进入 config/environments/development.rb而不是 config/application.rb,所以它只适用于您的开发环境。

您可以列出单个 IP 或整个网络的白名单。

假设你想与 192.168.0.100共享你的控制台,你可以这样做:

class Application < Rails::Application
config.web_console.whitelisted_ips = '192.168.0.100'
end

如果你想把整个私人网络列入白名单,你可以这样做:

class Application < Rails::Application
config.web_console.whitelisted_ips = '192.168.0.0/16'
end

如果您不想再看到此消息,请将此选项设置为 false:

class Application < Rails::Application
config.web_console.whiny_requests = false
end

小心你的愿望,因为你可能会得到一切

这可能只是为了开发的目的,因此您可能更愿意将它放在 config/environments/development.rb而不是 config/application.rb下。

将 IP 硬编码到配置文件中是不好的。其他开发人员怎么办? 如果 IP 发生变化怎么办?

只要有可能,与 Docker 相关的配置不应泄漏到 Railsapp 中。这就是为什么应该在 config/environments/development.rb文件中使用 env vars:

class Application < Rails::Application
# Check if we use Docker to allow docker ip through web-console
if ENV['DOCKERIZED'] == 'true'
config.web_console.whitelisted_ips = ENV['DOCKER_HOST_IP']
end
end

您应该在 .env文件中设置正确的 env vars,而不是跟踪到版本控制中。

docker-compose.yml中,你可以用 env_file从这个文件中注入 env vars:

app:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
links:
- db
environment:
- DOCKERIZED=true
env_file:
- ".env"

根据收到的反馈意见,我们还可以构建一个没有环境变量的解决方案:

class Application < Rails::Application
# Check if we use Docker to allow docker ip through web-console
if File.file?('/.dockerenv') == true
host_ip = `/sbin/ip route|awk '/default/ { print $3 }'`.strip
config.web_console.whitelisted_ips << host_ip
end
end

出于学习的目的,我将把解决方案留给 env var。

config/development.rb中的自动发现

config.web_console.whitelisted_ips = Socket.ip_address_list.reduce([]) do |res, addrinfo|
addrinfo.ipv4? ? res << IPAddr.new(addrinfo.ip_address).mask(24) : res
end

当然可能需要加上

require 'socket'
require 'ipaddr'

在你的档案里。

欢迎任何人进入我的私人网络。

我运行在一个码头集装箱,我不关心它想使用哪个网络本周。

Config/environment/development.rb add 行

config.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']

如果您想停止看到这个错误消息,您可以在 发展 RB中添加这一行

config.web_console.whiny_requests = false

对于开发环境: 检测它是否是 docker,然后确定 IP 地址并将其列入白名单

# config/environments/development.rb
require 'socket'
require 'ipaddr'


Rails.application.configure do
...


# When inside a docker container
if File.file?('/.dockerenv')
# Whitelist docker ip for web console
# Cannot render console from 172.27.0.1! Allowed networks: 127.0.0.1
Socket.ip_address_list.each do |addrinfo|
next unless addrinfo.ipv4?
next if addrinfo.ip_address == "127.0.0.1" # Already whitelisted


ip = IPAddr.new(addrinfo.ip_address).mask(24)


Logger.new(STDOUT).info "Adding #{ip.inspect} to config.web_console.whitelisted_ips"


config.web_console.whitelisted_ips << ip
end
end
end

对我来说,这个打印了以下内容,警告就消失了

Adding 172.27.0.0 to config.web_console.whitelisted_ips
Adding 172.18.0.0 to config.web_console.whitelisted_ips

我的解决办法是

class Application < Rails::Application
config.web_console.whitelisted_ips = %w( 0.0.0.0/0 ::/0 )
end

如果您正在使用 Docker,那么您很可能既不希望引入新的 ENV 变量,也不希望对特定的 IP 地址进行硬编码。

相反,您可能希望使用 /proc/1/cgroup检查您是否在 Docker 中,并允许您的主机 IP (对于 web_consolebetter_errors都是如此)。加入你的 config/environments/development.rb

  # https://stackoverflow.com/a/20012536/4862360
if File.read('/proc/1/cgroup').include?('docker')
# https://stackoverflow.com/a/24716645/4862360
host_ip = `/sbin/ip route|awk '/default/ { print $3 }'`.strip


BetterErrors::Middleware.allow_ip!(host_ip) if defined?(BetterErrors::Middleware)
config.web_console.whitelisted_ips << host_ip
end

对我来说,whitelisted_ips似乎不适用于一个新项目。Readme 声明相应的配置条目现在应该是 permissions:

Rails.application.configure do
config.web_console.permissions = '192.168.0.0/16'
end

Https://github.com/rails/web-console/blob/master/readme.markdown

如果您在本地(在主机上)运行您的站点,那么通常情况下是可行的,因为 127.0.0.1总是被允许的。但是如果你想把你的站点放到一个容器中(不是在生产环境中,而是在本地) ,你可能需要把它添加到 config/environments/development.rb中:

require 'socket'
require 'ipaddr'
Rails.application.configure do
...
config.web_console.permissions = Socket.getifaddrs
.select { |ifa| ifa.addr.ipv4_private? }
.map { |ifa| IPAddr.new(ifa.addr.ip_address + '/' + ifa.netmask.ip_address) }
...
end

附注: 大多数时候你希望它发牢骚(不想做 config.web_console.whiny_requests = false)。因为这可能意味着您正在生产环境中运行 web-console(您不应该这样做)。

我只是想添加这个,因为我自己的错误导致我得到相同的错误。

我没看到控制器上的这个

load_and_authorize_resource except: [:payment_webhook]

基本上,我使用 cancancan 在那条路线上放置授权,这会导致返回一个404。我看到了这条信息,以为这两者是相关的,但事实并非如此

Cannot render console from xxxxxx Allowed networks: xxxxx

因此,如果您得到一个错误消息,它可能与您看到的 Cannot render console from xxxxxx Allowed networks: xxxxx无关-寻找其他问题!

注意,只使用最后一个‘ config.web _ sole. whitelist _ ips’

  config.web_console.whitelisted_ips = '10.0.2.2'
config.web_console.whitelisted_ips = '192.168.0.0/16'

将只有白名单192.168.0.0/16,而不是10.0.2.2。

相反,使用:

  config.web_console.whitelisted_ips = ['10.0.2.2', '192.168.0.0/16']