限制 rails 路由仅在内部调用
Constraining a rails route to only be called internally
在将 Javascript、JQuery 和 AJAX 与 Rails 一起使用时,我们通常有一些内部 routes/urls 可以作为助手调用。
例如,如果我有一个使用 Twitter Typeahead 的搜索栏,我可能会使用像 /search/suggestions
这样的内部路由,我的 Javascript 可以调用它来预加载一些预先输入的建议。
如何防止 external/public 用户调用这样的路由?重要的是只有 "internal app" 可以访问此路由。
我试图限制到 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'
谢谢!
使用浏览器,任何人都可以在 url 中输入任何内容。那么如何阻止某人访问他们无权访问的 url/route/page?
您必须在控制器执行操作之前挂钩请求。如果进入控制器的请求来自有效的请求者,则执行操作,否则显示消息并重定向,或任何您需要的。
我有一个应用程序,用户只能看到他们自己的提要,而不能看到其他任何人;只编辑自己的帖子等。用户状态由会话控制器维护。
您的 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 重定向 -- 安全网
在路由中,我总是喜欢有一个包罗万象的重定向,以防有人在浏览器中输入无效的 URL。如果您没有这个并且有人手动编辑了您的路线中不存在的 URL,您的应用程序会崩溃并显示找不到路线,这很丑陋:
routes.rb
# This is a catchall 301 redirect to home (does not help with (e) type errors)
get "*path", to: redirect('/')
可能还有其他解决方案,可能是,但如果对您有用,请尝试一下这个想法。如果您有任何问题,请告诉我。
在将 Javascript、JQuery 和 AJAX 与 Rails 一起使用时,我们通常有一些内部 routes/urls 可以作为助手调用。
例如,如果我有一个使用 Twitter Typeahead 的搜索栏,我可能会使用像 /search/suggestions
这样的内部路由,我的 Javascript 可以调用它来预加载一些预先输入的建议。
如何防止 external/public 用户调用这样的路由?重要的是只有 "internal app" 可以访问此路由。
我试图限制到 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'
谢谢!
使用浏览器,任何人都可以在 url 中输入任何内容。那么如何阻止某人访问他们无权访问的 url/route/page?
您必须在控制器执行操作之前挂钩请求。如果进入控制器的请求来自有效的请求者,则执行操作,否则显示消息并重定向,或任何您需要的。
我有一个应用程序,用户只能看到他们自己的提要,而不能看到其他任何人;只编辑自己的帖子等。用户状态由会话控制器维护。
您的 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 重定向 -- 安全网
在路由中,我总是喜欢有一个包罗万象的重定向,以防有人在浏览器中输入无效的 URL。如果您没有这个并且有人手动编辑了您的路线中不存在的 URL,您的应用程序会崩溃并显示找不到路线,这很丑陋:
routes.rb
# This is a catchall 301 redirect to home (does not help with (e) type errors)
get "*path", to: redirect('/')
可能还有其他解决方案,可能是,但如果对您有用,请尝试一下这个想法。如果您有任何问题,请告诉我。