首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 5:使用纯代码获取网络IP地址范围

Rails 5:使用纯代码获取网络IP地址范围
EN

Stack Overflow用户
提问于 2018-09-15 17:08:35
回答 2查看 175关注 0票数 0

我想限制在某个控制器中访问我的网站的某些页面的特定IP地址范围,这是我知道如何做,但我无法找到一种方法来获得IP地址范围使用代码.有可能吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-15 20:40:52

您可以找到从request.remote_ip发出请求的客户端的IP。

然后定义一个自定义约束来限制对某些IP或IP范围的访问。

您的route.rb文件将如下所示

代码语言:javascript
复制
require "ipaddr"

MyApp::Application.routes.draw do
  resources :users

  constraints Whitelist.new do
     get 'protected_routes'
  end

end

class WhiteList
  def initialize
    @ips = ['127.0.0.1', '203.123.10.1']
    @ip_ranges = [
                   {
                     start_ip: '192.168.0.1',
                     end_ip:   '192.168.0.30'
                   },

                   {
                     start_ip: '10.1.1.1',
                     end_ip:   '10.1.1.100'
                   }
                 ]
  end

  def matches?(request)
    return true if @ips.include? request.remote_ip

    remote_ip_address = IPAddr.new(request.remote_ip).to_i

    @ip_ranges.each do |ip_range|
        low  = IPAddr.new(ip_range[:start_ip]).to_i
        high = IPAddr.new(ip_range[:end_ip]).to_i
        return true if (low..high)===remote_ip_address
    end

    return false
  end

end
票数 1
EN

Stack Overflow用户

发布于 2018-09-15 20:33:32

代码语言:javascript
复制
class SomeController < ApplicationController
  before_action :restrict_access, only: %i( action1 )

  def action1
    # something
  end

  def action2
    # something else
  end

  private

  def restrict_access
    unless TRUSTED_IPS.include? request.remote_ip
      flash[:error] = "Sorry. You are not allowed."
      redirect_to root_path
    end 
  end

  TRUSTED_IPS = [
    "192.168.1.13",
    "192.168.1.19",
  ]
end

这将允许您限制对特定IP的访问。如果要限制在单个IP范围内,还可以执行以下操作:

代码语言:javascript
复制
private

def restrict_access
  if !( ip_to_int(request.remote_ip) > ip_to_int(MIN_IP) 
    and ip_to_int(request.remote_ip) < ip_to_int(MAX_IP) )
    flash[:error] = "Sorry. You are not allowed."
    redirect_to root_path
  end
end

def ip_to_int(ip)
  request.remote_ip.split(".").map{|el| el.rjust(3,'0')}.join.to_i
end

MIN_IP = "192.168.0.13"
MAX_IP = "192.168.0.46"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52346990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档