2011-06-23 101 views
3

如何通過IP地址限制對所有設計控制器的訪問?我試圖只允許來自特定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 
... 

回答

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) 
    [email protected]?(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)。

+0

非常感謝,這似乎是一個很好的習俗。 – ndbroadbent

3

我相信所有的設計器的擴展應用程序控制器,所以你可以把方法在ApplicationController中作爲一個受保護的方法,那麼你只需要調用

before_filter :restrict_access 
每個

設計控制器。

相關問題