Как я могу ограничить доступ ко ВСЕМ разработчикам контроллеров по IP-адресу? - PullRequest
3 голосов
/ 23 июня 2011

Как я могу ограничить доступ ко всем устройствам devise по IP-адресу?Я пытаюсь разрешить только пользователям с определенного IP-адреса просматривать интерфейс / страницы администратора.

Я нашел этот подход.Который должен включать метод restrict_access в фильтр before.Однако, это немного повторяется, если мне нужно скопировать этот метод на все контроллеры Devise, которые я сейчас использую.

Есть ли лучший подход?

class Admin::SessionsController < Devise::SessionsController

  before_filter :restrict_access

  # Needed to restrict access to a set of IP's only. We don't want random users trying to access the admin interface
    def restrict_access
      if Rails.env == 'development' or Rails.env == 'test'
        whitelist = ['59.120.201.20', '59.120.201.21'].freeze
      else
        whitelist = ['59.120.201.20', '59.120.201.21'].freeze
      end

      unless whitelist.include? request.remote_ip
        redirect_to root_path, :notice => 'Access denied!'
      end
    end
...

Ответы [ 2 ]

3 голосов
/ 24 июня 2011

Создайте класс, подобный следующему, и поместите его в RAILS_ROOT/lib/blacklist_constraint.rb.

class BlacklistConstraint
  def initialize
    if Rails.env == 'development' or Rails.env == 'test'
      @whitelist = ['59.120.201.20', '59.120.201.21'].freeze
    else
      @whitelist = ['59.120.201.20', '59.120.201.21'].freeze
    end
  end

  def matches?(request)
    !@whitelist.include?(request.remote_ip)
  end
end

... и в вашем файле rout.rb ...

match "*", :constraints => BlacklistConstraint.new, :controller => "blacklist", :action => "my_access_denied_action"

Вам может потребоваться загрузить класс в инициализаторе или изменить config.autoload_paths += %W(#{Rails.root}/lib) в config/application.rb (Rails3.x).

3 голосов
/ 23 июня 2011

Я считаю, что все Devise Controller расширяют ваш контроллер приложений, поэтому вы можете поместить метод в ApplicationController как защищенный метод, тогда вам нужно только вызвать

before_filter :restrict_access

на каждом контроллере устройства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...