[ruby-it] Rails, file server e account

Pietro Giorgianni giorgian a gmail.com
Lun 7 Dic 2009 21:29:03 CET


Il 07 dicembre 2009 20.28, Railin Railin <a3074101 a uggsrock.com> ha scritto:
> 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:
http://railscasts.com/episodes/188-declarative-authorization

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):
http://api.rubyonrails.org/classes/ActionController/Streaming.html


Se ho mancato completamente il punto, se ho detto sciocchezze o se ci
sono altre questioni che mi sono sfuggite, fammi sapere.


pietro


More information about the Ml mailing list