Rails 5: Получить диапазон IP-адресов сети, используя код PURE - PullRequest
0 голосов
/ 15 сентября 2018

Я хотел ограничить доступ к определенным страницам моего веб-сайта в определенном контроллере определенным диапазоном IP-адресов, что я понял, как это сделать, но я не могу найти способ получить диапазон IP-адресов с помощью PURE код ... Возможно ли это в любом случае?

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

IP-адрес клиента, отправляющего запрос, можно найти по номеру request.remote_ip.

. Затем определите пользовательское ограничение для ограничения доступа к определенным IP-адресам или диапазонам IP-адресов.

Ваш маршрут.рб файл будет выглядеть так

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
0 голосов
/ 15 сентября 2018
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-адресов, вы также можете сделать что-то вроде:

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...