Ruby on rails 检查用户是否来自给定IP块和重定向的最简单方法?

Ruby on rails 检查用户是否来自给定IP块和重定向的最简单方法?,ruby-on-rails,ruby,ip,Ruby On Rails,Ruby,Ip,以下是我在应用程序控制器中编写的代码: class ApplicationController < ActionController::Base protect_from_forgery before_filter :redirect_if_bolivia private def redirect_if_bolivia if (bolivia_ip_block).includes? request.remote_ip #redirect use

以下是我在应用程序控制器中编写的代码:

class ApplicationController < ActionController::Base
  protect_from_forgery

  before_filter :redirect_if_bolivia

  private

  def redirect_if_bolivia
    if (bolivia_ip_block).includes? request.remote_ip
        #redirect user to www.foo.com
    end
  end

  def bolivia_ip_block
    %w {
        12.144.86.0 - 12.144.87.255
31.201.1.176 - 31.201.1.179
46.36.198.101 - 46.36.198.105
46.136.172.0 - 46.136.172.255
63.65.11.0 - 63.65.12.254
65.173.56.0 - 65.173.63.255
67.23.241.179 - 67.23.241.198
72.32.164.56 - 72.32.164.63
72.46.244.32 - 72.46.244.47
74.91.16.48 - 74.91.16.55
74.91.16.208 - 74.91.16.215
74.91.20.48 - 74.91.20.71
74.112.134.120 - 74.112.134.127
74.112.135.104 - 74.112.135.111
74.205.37.16 - 74.205.37.23
78.24.205.32 - 78.24.205.47
98.129.27.88 - 98.129.27.95
98.129.91.40 - 98.129.91.47
166.114.0.0 - 166.114.255.255
167.157.0.0 - 167.157.255.255
174.143.165.80 - 174.143.165.87
186.0.156.0 - 186.0.159.255
186.2.0.0 - 186.2.127.255
186.27.0.0 - 186.27.127.255
190.0.248.0 - 190.0.255.255
190.3.184.0 - 190.3.191.255
    }
  end
end
class ApplicationController
那么基本上,检查
请求.remote_ip
是否属于玻利维亚ip块的最简单方法是什么

我不认为迭代每个块并输出相应的IP,将其添加到数组中是有效的。事实上,这将导致我为每个请求创建数千个条目的数组。

我相信这不是一个新问题,所以我希望有一个行之有效的解决方案


也许我可以检查前三个八位组是否匹配,那么它属于区块?在Ruby中如何进行简单的字符串比较?

您可以将子网转换为符号,因为块不是任意的。然后你可以利用

需要“ipaddr”
类ApplicationController
我对IP子网不太熟悉(我在大学时没有通过这门课程),我怎么知道什么时候应该输入“/25”或“/30”?。另外,“ipaddr”是Ruby中的默认库还是我必须获取的gem?ipaddr在标准库中,应该已经包括在内。您可以使用提供的链接(我在后面编辑)找到“/NN”。它获取您拥有的范围并提供您应该使用的“/NN”。好的,我已经在所有块中添加了,但是,当我运行
rails-s
并尝试它时,我根本没有重定向。我已经删除了条件和重定向,不管它如何工作,所以重定向代码是正确的,问题在于我的IP和我列出的块之间的检查。如果我在本地测试我的应用程序,是否使用不同的IP?您可能正在使用127.0.0.1进行测试。您可以将127.0.0.0/8添加到块列表中,它将重定向您;过滤现在工作正常。谢谢你的帮助。
require 'ipaddr'

class ApplicationController < ActionController::Base
  protect_from_forgery

  before_filter :redirect_if_bolivia

  private

  def redirect_if_bolivia
    if bolivian_blocks.any? { |block| block.include?(request.remote_ip) }
        #redirect user to www.foo.com
    end
  end

  def bolivian_blocks
    %w{
      12.144.86.0/23
      31.201.1.176/30
    }.map { |subnet| IPAddr.new subnet }
  end
end