Rails, file server e account

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.

Railin

Il 07 dicembre 2009 20.28, Railin R. [email protected] 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:

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.

pietro

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:

Autlogic

Restful authentication
http://avnetlabs.com/rails/restful-authentication-with-rails-2-usage

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.

Railin

Pietro: Mi sei stato veramente utile :wink:
Paolo: Consigli di utilizzare plugin per il login? o meglio fare a
mano!?

Il sito in se, con autenticazione e gestione dei permessi non è un
problema, ci perderò un po’ di tempo ma potro farmi le ossa on rails,
anche perché in caso di problemi c’è molto materiale sul web, invece
proprio per il file storage non avevo trovato nulla quindi vi sono molto
grato per l’aiuto.

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 :slight_smile:

R. Railin wrote:

Paolo: Consigli di utilizzare plugin per il login? o meglio fare a
mano!?

E’ sempre meglio usare un plugin perché:

  1. ha più funzionalità di quelle che potrebbe avere il tuo codice (o il
    mio!) anche dopo un giorno o due di lavoro
  2. ha meno bug perché è da mesi o anni che viene usato
  3. 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.

Paolo

Il 08 dicembre 2009 01.38, R. Railin [email protected] ha scritto:

Pietro: Mi sei stato veramente utile :wink:
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 :slight_smile:

Non ho altri link sul tema, giusto un paio di dritte:

  1. fai tutto nel model, tratta il file come un attributo virtuale -
    #167 More on Virtual Attributes - RailsCasts
  2. scrivi un metodo che salvi il file e uno che lo legga, e fai usare
    a entrambi un terzo metodo, che decida il percorso;
  3. 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.

pietro

Grazie anche a te Luca, adesso dovrei avere tutto il necessario :slight_smile:

Luca M. wrote:

2009/12/8 R. Railin [email protected]:

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 :slight_smile:

io userei un plugin, ad esempio Paperclip:
GitHub - thoughtbot/paperclip: Easy file attachment management for ActiveRecord (visto che siamo in tema ecco
lo screencast: #134 Paperclip - RailsCasts ).
Implementa tutto quello che ti serve per gestire i file sul filesystem
(e perche’ no, se servisse anche su Amazon S3)

ciao,
Luca

Cercando ho anche trovato una cosa simile a quella che volevo fare io:

Al max prendo esempio da questa applicazione.

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.


David N. Welton

http://www.welton.it/davidw/

http://www.dedasys.com/
Sent from Padua, Veneto, Italy

2009/12/8 R. Railin [email protected]:

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 :slight_smile:

io userei un plugin, ad esempio Paperclip:
GitHub - thoughtbot/paperclip: Easy file attachment management for ActiveRecord (visto che siamo in tema ecco
lo screencast: #134 Paperclip - RailsCasts ).
Implementa tutto quello che ti serve per gestire i file sul filesystem
(e perche’ no, se servisse anche su Amazon S3)

ciao,
Luca

2009/12/13 David W. [email protected]

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.

http://ThinkCode.TV - Screencast e videocorsi di programmazione
http://antoniocangiano.com - Zen and the Art of Programming
http://math-blog.com - Mathematics is wonderful!
Follow me on Twitter: http://twitter.com/acangiano
Author of “Ruby on Rails for Microsoft Developers” (Wrox, 2009)