Devo realizzare un web-Server ( da spedire in seguito in una webfarm ).
Sul server viene hostato un sito realizzato in rails, questo sito oltre
alle solite pagine (index, help, about etc) ha un area clienti riservata
a cui si accede tramite login. Ogni cliente può fare l’upload e il
download di file che vanno nella propria cartella personale e soltanto
il cliente stesso e gli amministratori possono vederne il contenuto etc
etc
Un altro problema che potrebbe seguire questo è:
Se l’utente A copia l’indirizzo dove è localizzato un file sul server,
può l’utente B copiando l’url scaricare quel file?!
Dovrei evitare che sia possibile che B scarichi il file se non ha i
permessi.
Spero possiate aiutarmi, anche solo indirizzarmi verso la via giusta,
non cerco pappa pronta, ma essendo nuovo al Ruby on Rails qualche
indicazione da qualcuno con più esperienza.
Salve a tutti,
Devo realizzare un web-Server ( da spedire in seguito in una webfarm ).
Sul server viene hostato un sito realizzato in rails, questo sito oltre
alle solite pagine (index, help, about etc) ha un area clienti riservata
a cui si accede tramite login. Ogni cliente può fare l’upload e il
download di file che vanno nella propria cartella personale e soltanto
il cliente stesso e gli amministratori possono vederne il contenuto etc
Dovrei evitare che sia possibile che B scarichi il file se non ha i
permessi.
Ciao,
la soluzione più semplice è non caricare i file in /public ma da
qualche altra parte inaccessibile dall’esterno (cioè su filesystem o
su db) e servirli solo da controller.
Principali motivi pro db:
non devi gestire anche il filesystem, quindi maggiore
semplicità;* tenendo tutti i dati su db, devi fare solo il backup del db, senza
altre complicazioni e senza rischio di dati inconsistenti;
Motivi pro filesystem:
non tutti i db si comportano bene quando si tratta di gestire
tabelle che occupano vari gigabyte;
non so active_record 2.3, ma il 2.1 con ruby 1.8.6 gestiva malissimo
i campi binary, trattandoli come array di byte, vale a dire che (ho
provato tempo fa con mssql) con un file da 12mb non bastavano 3Gb di
ram a contenere il record in memoria;
scrivere ModelloCheContieneFile.all è cosa da non fare con
leggerezza, dato che molti gb di dati si troveranno a passare per la
connessione col database; questo significa che probabilmente dovrai
gestire esplicitamente le query, per richiedere il campo contenente il
file solo quando ti serve davvero.
Per quanto riguarda i permessi puoi dare un’occhiata a Declarative
Authorization, su cui c’è un interessantissimo episodio di railscasts:
Nell’episodio si parla espressamente del caso in cui si voglia dare un
certo permesso solo al ruolo admin e al proprietario di un oggetto, mi
sembra proprio quello che ti serve.
Se ti va bene il normale upload http (senza applet o flash), nella
view ti basta ricordare di specificare :html => {:multipart => true}
nel form_for, e nel controller ti ritrovi un file, leggibile con
params[:nomeoggetto][:nomeparametro].read
Per il download del file, ci sono send_data o send_file (a seconda di
dove si trova il file da restituire):
Se ho mancato completamente il punto, se ho detto sciocchezze o se ci
sono altre questioni che mi sono sfuggite, fammi sapere.
Non mi è chiaro se l’autenticazione degli utenti sia già stata fatta
oppure no. Supponendo di sì, quel che devi fare è servire il file da un
metodo di un controller che richieda l’autenticazione degli utenti, per
poter controllare che ci siano i permessi giusti. Normalmente lo si fa
impostando un before_filter.
Vedi come esempio questi due tutorial per i due plugin di autenticazione
che vanno per la maggiore:
Se invece ti manca ancora l’autenticazione, quei due plugin si occupano
di gestire registrazione ed autenticazione degli utenti per cui a
partire da quei tutorial troverai tutta la documentazione che ti serve.
Paolo
R. Railin wrote:
Salve a tutti,
Avrei un problema riguardo ad un progetto:
Devo realizzare un web-Server ( da spedire in seguito in una webfarm ).
Sul server viene hostato un sito realizzato in rails, questo sito oltre
alle solite pagine (index, help, about etc) ha un area clienti riservata
a cui si accede tramite login. Ogni cliente può fare l’upload e il
download di file che vanno nella propria cartella personale e soltanto
il cliente stesso e gli amministratori possono vederne il contenuto etc
etc
Un altro problema che potrebbe seguire questo è:
Se l’utente A copia l’indirizzo dove è localizzato un file sul server,
può l’utente B copiando l’url scaricare quel file?!
Dovrei evitare che sia possibile che B scarichi il file se non ha i
permessi.
Spero possiate aiutarmi, anche solo indirizzarmi verso la via giusta,
non cerco pappa pronta, ma essendo nuovo al Ruby on Rails qualche
indicazione da qualcuno con più esperienza.
Se avete altri link, sono lieto di navigare un po’ anche per vedere le
varie alternative, comunque credo che mi orienterò su filesystem, quindi
altri link mirati su questo argomento mi farebbero felice
dopo un’ora o due il problema dell’autenticazione è risolto (e la
prossima volta ti servirà molto meno tempo)
Questo vale non solo per l’autenticazione ma in generale anche per
qualsiasi altra cosa.
Tuttavia fare tutto a mano almeno una volta nella vita permette di
capire meglio certi problemi per cui potrei anche consigliarti di
scriverti le tue routine di registrazione ed autenticazione per questa
volta e di usare plugin solo a partire dal prossimo progetto.
Pietro: Mi sei stato veramente utile
Paolo: Consigli di utilizzare plugin per il login? o meglio fare a
mano!?
Nell’episodio di railscasts su declarative authorization si usa
authlogic, che viene spiegato in un altro episodio:
Riguardo al gestire l’autenticazione a mano: io l’ho fatto nel mio
primo progetto rails, quando di questo avevo appena un’infarinatura.
Ho scritto le mie routine di autenticazione e di gestione dei
permessi; mi ha dato molta soddisfazione e mi ha insegnato tante cose,
ma è stato un massacro, anche perché l’ho dovuto riscrivere più volte
prima di trovare una forma soddisfacente.
Se avete altri link, sono lieto di navigare un po’ anche per vedere le
varie alternative, comunque credo che mi orienterò su filesystem, quindi
altri link mirati su questo argomento mi farebbero felice
Non ho altri link sul tema, giusto un paio di dritte:
scrivi un metodo che salvi il file e uno che lo legga, e fai usare
a entrambi un terzo metodo, che decida il percorso;
piazza tutti i file nella stessa directory dà problemi di
performance, ti conviene usare un percorso su due o tre livelli, in
base a quanti file prevedi di gestire.
Puoi fare in due modi:
decidi il percorso in base all’id dell’oggetto, esempio: l’oggetto
di id 3465 sta nella cartella RAILS_ROOT/files/465/;
alla creazione calcoli il percorso in qualche modo e poi lo piazzi
in un campo dell’oggetto.
In questo modo il controller resta uguale agli altri, e anche il model
resta snello e maneggevole.
Se avete altri link, sono lieto di navigare un po’ anche per vedere le
varie alternative, comunque credo che mi orienter� su filesystem, quindi
altri link mirati su questo argomento mi farebbero felice
Come ultima cosa, cosa mi consigliate apache e mongrel? lighttpd? Magari
con le motivazioni, in modo da poter scegliere anche in futuro secondo
le varie esigenze, vi ringrazio ancora.
Come ultima cosa, cosa mi consigliate apache e mongrel? lighttpd? Magari
con le motivazioni, in modo da poter scegliere anche in futuro secondo
le varie esigenze, vi ringrazio ancora.
Io mi trovo bene con Apache e Passenger: ci pensa lui a tirare su
nuove istanze quando servono. Con Mongrel, devi indovinare quanti ti
possono servire in partenza, e aggiustare quel numero quando vedo che
non era giusto.
Se avete altri link, sono lieto di navigare un po’ anche per vedere le
varie alternative, comunque credo che mi orienterò su filesystem, quindi
altri link mirati su questo argomento mi farebbero felice
Io mi trovo bene con Apache e Passenger: ci pensa lui a tirare su
nuove istanze quando servono. Con Mongrel, devi indovinare quanti ti
possono servire in partenza, e aggiustare quel numero quando vedo che
non era giusto.
Aggiungo solo che invece di Apache, consiglierei di usare nginx: più veloce
e leggero.