如何通过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
...
答案 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)。