如何通过IP地址限制对所有设备控制器的访问?

时间:2011-06-23 03:23:34

标签: ruby-on-rails-3 devise

如何通过IP地址限制对所有设备控制器的访问?我试图只允许来自特定IP地址的用户查看管理界面/页面。

我发现了这种方法。哪个是在before过滤器中包含restrict_access方法。但是,如果我必须在我当前使用的所有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 个答案:

答案 0 :(得分:3)

我相信所有的Devise Controller都会扩展你的Application控制器,所以你可以把这个方法作为一个受保护的方法放在ApplicationController中,然后你只需要调用

before_filter :restrict_access

在每个设备控制器上。

答案 1 :(得分:3)

构建如下所示的类并将其放在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

...并在您的routes.rb文件中......

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

您可能需要在初始值设定项中加载该类,或修改config.autoload_paths += %W(#{Rails.root}/lib)中的config/application.rb(Rails3.x)。