2011-09-12 11 views
2

右のように、ユーザーのサインアップや認証を一切必要としないサイトのオーダーフォームを作成しています。フォームには、Order、OrderImage、Printという3つのモデルがあります。オーダーフォームには多くのOrderImageがあり、OrderImageには多くのプリントがあります。認証なしの安全なRails 3 MultiStepオーダーフォームのベストアプローチ

画像をアップロードする機能(OrderImage's)と、Orderを確認して送信する前に、各OrderImageを元に戻して編集する機能が必要です。

フォームは多段階であり、4つのステージで構成された:

  1. アップロード画像
  2. レビューアップロード
  3. あなたの詳細
  4. 確認アップロード

これは素晴らしいですし、すべてがあります計画どおりに作業し、ユーザーが詳細を入力したり、アップロードしたりすると、Orderプロセス全体を通じてデータがデータベースに保存されます。再画像。

しかし、これは「/ upload?order = 5」などのURLが存在しないことを意味します。認証がないため、誰でも注文のURLを推測して変更する可能性があります。

私はこのプロセスを管理する最良の方法が何であるか疑問に思っていますか?私は心の中でアイデアのカップルを得たが、それらのいずれかが問題に最適なソリューションであればわからないしました:

  1. URLはもっとようになるので、例えば6桁以内でランダムな順序番号を生成します: "/ upload?order = 645029"となります。これは、誰かが注文番号を推測する機会が少なくなるが、実際にはそれほど安全ではないことにつながる。

  2. 上記の考えを「完了」などの注文状況と組み合わせると、したがって、注文書が最終的に提出されると、それは完全とマークされます。その後、「Complete」注文に再度アクセスすることを防ぐことができます。しかし、注文処理中に注文番号は推測され、改ざんされる可能性があります。

  3. セッションを利用してURLの代わりに注文番号をここに格納するか、フォームの隠し値として保存します。

私はRyan Batesの「Railscast on Multistep」形式で、セッションにデータを格納するのを見ました。しかし、Ryan自身は、複雑なモデルやオブジェクトをこのように格納することは実用的ではないことを認めています。

したがって、認証されていないオーダーフォームを処理するための最良の方法については、ありがとうございます。ありがとうございます。

答えて

0

オプション#3を使用します。セッションに複雑なオブジェクトを格納するのは良いことではありませんが、保存する必要があるのは注文のID番号だけで、データベース内で検索することができます。あなたは、要求されたため、現在のユーザーに属していることを確認するためにbefore_filterを使用することができます。

class OrdersController < ApplicationController 
    before_filter :check_ownership, :except => [:new, :create] 

    private 

    def check_ownership 
    redirect_to '/' unless params[:id] == session[:current_order_id] 
    end 
end 

この例では、簡単にアカウントを持つユーザーは、自分の注文履歴(だけではなく、現在の順)を表示できるようにするために、後に拡張することができます。オプション#1と#2は問題を隠蔽しているだけであり、後で拡張することはおそらくより困難です。

+0

Btw、この例を使用する場合は、型に注意してください。 'params [:id]'は文字列であり、 'session [:current_order_id]'は文字列か整数かもしれません。 – David

0

私は質問に答えるのが嫌ですが、後でサイトに戻ったときにユーザーはどのように注文を見つけるのですか?

登録しないと、ユーザーを注文に関連付ける方法を見つける必要があります。

どうやって安全に行うことができないのでしょうか、少なくともユニークなユーザー名を要求しています。

しかし、誰もがこのユーザー名を推測して注文に行くことができます。

私はあなたが認証を望まないなら、他のユーザーが誰の注文を見ても気にしないと言います!

これが問題になる場合は、簡単な形式の認証が必要です。

+0

ユーザは、提出された注文にアクセスする必要はありません。送信された注文は処理され、オフラインで請求されます。 – Pete

+0

@ Cygnusx1のように、ユーザーは送信した後で注文にアクセスすることはできませんが、生成されたアクセストークンを持つリンクを電子メールで送信するのは本当に簡単です(例: '/ orders/42?access_token = 988881adc9fc3655077dc2d4d757d480b5ea0e11'。 – David

+0

ok私は思っています.. ..: "また、注文が確認されて提出される前に各OrderImageに戻って編集する機能もあります。私はユーザーが戻って来て、彼の注文を変更することができると理解した!しかし、私は皆、これは1回のセッションの中でこれをしたいと思いますか? – Cygnusx1

関連する問題