【问题标题】:How to handle routing related to "required" parameters?如何处理与“必需”参数相关的路由?
【发布时间】:2012-02-11 08:28:09
【问题描述】:

我正在使用 Rails 3.1.0,我想以 proper 方式“要求”路由器 URL 中的参数字符串。也就是说,我有一个token 参数,必须在执行 HTTP POST 请求时进行检查,以便更新用户信息:

my_site_name/user/1?token=12345abcdr

我计划在router.rb 文件中添加一个约束,以便“要求”token可取吗?我应该这样进行吗?如果有,我该如何说明相关的路由器?


也许我可以声明/使用“命名路由器”以这种方式传递两个参数:

confirm_user_url(@user, token)

【问题讨论】:

  • 你能澄清一下你所说的令牌是什么意思吗?这与 current_user 有何不同?它看起来类似于丢失密码的 md5 散列方案,但该方案存在是因为不能成为 current_user
  • 为什么不需要设置 POST 令牌?如果在更新 users_controller 中的用户信息之前未设置令牌,您可以将用户重定向到另一个页面。但我不确定您要归档什么 - 可能是某种 csrf 预防方式吗?如果是,那么 rails 已经默认实现了,请参阅this link
  • @timpone - 是的,即:用于丢失密码的 md5 散列方案。
  • @markus - 不,这不是预防 csrf 的一种方式。

标签: ruby-on-rails ruby ruby-on-rails-3 url routing


【解决方案1】:

据我了解,您正在尝试在“执行 HTTP POST 请求以更新用户信息”时设置令牌参数(顺便说一下,如果您正在更新,它不应该是 PUT 请求吗?) .如果是这样,为什么不使用自定义约束?在你的routes.rb:

class TokenConstraint
  def matches?(request)
    request.params[:token].present? # or other logic to check token
  end
end

MyApp::Application.routes.draw do
  put "/users/:id" => "users#update", :constraints => TokenConstraint.new
end

希望对你有帮助。

【讨论】:

    【解决方案2】:

    约束路由参数对检查语法很有用,仅此而已。

    在您的情况下,您可以将 before_filter 放在应用程序控制器或特定控制器上。

    在 application_controller.rb 中:

    before_filter :check_token
    .
    .
    .
    def check_token
     .
     .
     if token_valid
       # do this
     else 
       # do this
       return false # to stop further processing by other controllers
     end
    end
    

    【讨论】:

    • 您可能是对的,但有没有办法使用“命名路由”,例如“理解”/“关心”输入参数的confirm_user_url(@user, token)
    • 不确定是否理解问题。您可以使用 params[:token] 访问令牌并使用 params[:user] 访问用户,所以我认为您执行了所需的测试。
    • 我认为@AlainBeauvois 希望 URL 构造函数 工作。换句话说,URL 构造函数接受他的参数“token”,并以 params[:token] 的形式让控制器可以访问它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2023-03-05
    • 2018-03-06
    • 2020-08-21
    • 2012-09-05
    • 2017-03-29
    • 2018-08-16
    相关资源
    最近更新 更多