Domanda

Giusto, sto costruendo un modulo d'ordine per un sito che non richiede alcun tipo di registrazione o autenticazione dell'utente. Il modulo ha tre modelli: order, ordeMage, stampa. Un modulo d'ordine ha molti ordini e un ordine ha molte stampe.

Un utente richiede la possibilità di caricare immagini (orderImage) con il loro ordine e anche la possibilità di tornare indietro e modificare ogni ordine di ordine prima che l'ordine sia confermato e inviato.

La forma è multistep e composta da quattro fasi:

  1. Carica immagini
  2. Recensione dei caricamenti
  3. I tuoi dettagli
  4. Conferma i caricamenti

Questo va bene e tutto funziona come previsto e i dati vengono archiviati nel database durante il processo di ordine mentre l'utente inserisce maggiori dettagli o carica più immagini.

Tuttavia, questo significa che esistono URL come "/upload? Order = 5" che non è buono. Poiché non c'è autenticazione, ciò significa che chiunque potrebbe potenzialmente indovinare l'URL di un ordine e cambiarlo.

Quindi mi chiedo solo qual è il modo migliore per gestire questo processo? Ho in mente un paio di idee, ma non sono sicuro che una di esse sia la soluzione migliore per il problema:

  1. Genera un numero di ordine casuale entro 6 cifre, ad esempio, quindi l'URL sarebbe più simile: "/upload? Order = 645029". Ciò comporterebbe che ci sia meno possibilità che qualcuno indovini un numero di ordine, ma in realtà non è ancora molto sicuro.

  2. Combinando l'idea di cui sopra con uno stato sull'ordine, come "completo". Quindi, quando un ordine viene finalmente inviato, è contrassegnato come completo. Potrei quindi impedire l'accesso di qualsiasi ordini "completi". Tuttavia, durante il processo dell'ordine, il numero dell'ordine potrebbe ancora essere indovinato e manomesso.

  3. Utilizzare la sessione e memorizzare il numero dell'ordine qui anziché nell'URL o come valore nascosto nel modulo.

Ho visto Ryan Bates 'RailScast su forme a più fasi in cui memorizza i dati nella sessione. Tuttavia, lo stesso Ryan ammette che la memorizzazione di modelli e oggetti complessi in questo modo non è pratico.

Quindi qualsiasi suggerimento sul modo migliore per gestire un modulo d'ordine non autenticato sarebbe molto apprezzato, grazie.

È stato utile?

Soluzione

Andrei con l'opzione n. 3. Hai ragione sul fatto che non è bene archiviare oggetti complessi nella sessione, ma tutto ciò che devi archiviare è il numero ID dell'ordine, quindi puoi cercarlo nel database. Puoi usare un before_filter Per garantire che l'ordine richiesto appartenga all'utente corrente:

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

Questo esempio potrebbe essere facilmente esteso in seguito per consentire agli utenti con gli account di visualizzare la cronologia degli ordini (piuttosto che solo l'ordine attuale). Le opzioni n. 1 e #2 stanno solo mascherando il problema e probabilmente sarebbero più difficili da estendere in seguito.

Altri suggerimenti

Odio rispondere con una domanda ... ma: come fa un utente a trovare il suo ordine quando torna sul sito più tardi?

Senza registrazione, devi trovare un modo per associare un utente all'ordine!.

Non riesco a vedere come potresti farlo in modo sicuro, almeno chiedendogli un nome utente unico.

Ma poi chiunque sarebbe in grado di indovinare questo nome utente e arrivare all'ordine!.

Direi, se non vuoi l'autenticazione ... allora non dovresti preoccuparti che gli altri utenti vedano gli ordini di nessuno!

Se questo è un problema, avrai bisogno di una semplice forma di autenticazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top