约束rails路由只能在内部调用

时间:2015-08-28 17:09:22

标签: javascript jquery ruby-on-rails routes

在使用Jails,JQuery和带有Rails的AJAX时,我们经常会有一些内部路由/网址,我们可以将其称为帮助程序。

例如,如果我有一个使用Twitter Typeahead的搜索栏,我可能会使用我的Javascript可以调用的内部路由/search/suggestions来预加载一些预先建议。

如何防止外部/公共用户调用此类路由?重要的是只有“内部应用程序”才能访问此路由。

我试图用很少的运气限制到localhost的路线 -

constraints(ip: /127.0.0.1/) do
    get "/search/suggestions", to: "search#load_suggestions"
end

Rails抱怨它找不到那条路线,大概是因为这个限制。

ActionController::RoutingError (No route matches [GET] "/search/suggestions"):
  actionpack (4.2.2) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  actionpack (4.2.2) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.2.2) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.2.2) lib/rails/rack/logger.rb:20:in `block in call'

谢谢!

1 个答案:

答案 0 :(得分:1)

对于浏览器,任何人都可以在网址中输入任何内容。那么如何阻止某人访问他们无权访问的网址/路由/页面?

您必须在控制器执行操作之前挂钩请求。如果进入控制器的请求来自有效的请求者,则执行操作,否则显示消息和重定向,或者您需要的任何内容。

我有一个应用程序,用户只能看到他们自己的提要而不是任何人;只编辑自己的帖子等。用户状态由会话控制器维护。

您的Twitter预先请求者需要一些东西来识别自己,一个可以验证进入控制器的状态。这可以通过多种方式实现。我不会猜测你的应用是如何设置的。

在控制器中使用before_action来测试有效的请求者,在你的情况下是你的推特类型:

class YourController < ApplicationController 
before_action :validate_access 

private 
  def validate_access 
      unless twitter_user? 
          flash[:danger] = "You do not have access to this feature." 
      redirect_to root_url (whatever redirect you need) 
      end 
  end

Catchall 301重定向 - 安全网

在路线中,我总是喜欢对某个人在浏览器中输入无效网址的情况进行重新定位。如果你没有这个并且某人手工编辑了你的路线中不存在的网址,那么你的应用会因路线未找到而崩溃,这很难看:

的routes.rb

  # This is a catchall 301 redirect to home (does not help with (e) type errors)
  get "*path", to: redirect('/')

可能还有其他解决方案,但如果对您有用,请尝试一下这个想法。如果您有任何问题,请与我们联系。