2016-02-22 4 views
3

Как получить доступ к Rails.application.routes в промежуточном программном обеспечении Rails? Я думаю, что обычно route.rb обрабатывается выше в стеке, поэтому у меня нет реального доступа к нему. Как я могу получить доступ к моим маршрутам?Маршруты доступа в промежуточном программном обеспечении rails

+0

Что вы пытаетесь сделать в вашей части промежуточное программное обеспечение, которое требует знания маршрутов рельсов? –

+0

Я хочу усилить Rack Attack (https://github.com/kickstarter/rack-attack), добавив директивы маршрутов в route.rb для описания того, как защитить каждый путь. Идея состоит в том, чтобы добавить метаданные в файл routes.rb и что камень Rack Attack автоматически генерирует правильные дроссели, основываясь на информации, существующей в файле маршрутов. Таким образом, он будет намного более эффективным и последовательным. Поэтому, когда вы добавляете новый путь к файлу маршрутов, он будет автоматически защищен. Мне нужно иметь возможность программно анализировать/обрабатывать файл маршрутов. –

+1

Да, это кажется законным обоснованием. Хотя я лично не знаю, как этого добиться, может быть, кто-то это сделает. –

ответ

1

Ну, вот мое решение, как аннотировать файл маршрутов, так что я могу получить доступ к нему в моем промежуточном слое (в данном примере Rack Attack)

file = File.read(File.expand_path('../../routes.rb', __FILE__)) 
    file = file.split("\n")[1..-2].join("\n") # remove first line and last line 

    myroutes = Rails.application.routes 
    myroutes.prepend do 
    eval(file) 
    end 
    myroutes.clear! 
    counter = 0 
    myroutes.named_routes.routes.each do |route| # For each route 
    extractedroute = route[1] 
    if extractedroute.defaults[:attackip] != nil 
     attack = extractedroute.defaults[:attackip] 
     path = extractedroute.path.spec.left.to_s 
     attack.each do |method| # For each Attack method 
     counter = counter + 1 
     if method[:t] != nil # If we have a throttle 
      throttlename = 'throttle-'+counter.to_s+'-'+path 
      Rails.logger.error 'Creating throttle: '+throttlename 
      throttle(throttlename, :limit => method[:t][0], :period => method[:t][1]) do |req| 
      if req.path.start_with?(path) 
       req.ip 
      end 
      end  
     elsif method[:a] != nil 
      allow2banname = 'allow2banname-'+counter.to_s+'-'+path 
      Rails.logger.error 'Creating allow2ban: '+allow2banname 
      Rack::Attack.blacklist(allow2banname) do |req| 

      Rack::Attack::Allow2Ban.filter(allow2banname+req.ip, :maxretry => method[:a][0], :findtime => method[:a][1], :bantime => method[:a][2]) do  
       if req.path.start_with?(path) 
       true 
       end 
      end 
      end 
     end 

     end # For all attack mechanisms 
    end # If we have an attack directive 
    end # EOF for all routes 
    myroutes.prepend.clear 
Смежные вопросы