2010-01-29 9 views
5

Ho letto i problemi di sicurezza delle rotaie e quello che mi preoccupa di più è l'assegnazione di massa. La mia applicazione utilizza attr_accessible, tuttavia non sono sicuro di sapere quale sia il modo migliore per gestire le relazioni esposte. Supponiamo di avere un sito Web di creazione/proprietà di contenuti di base. Un utente può creare post sul blog e una categoria associata a quel post del blog.: problema di sicurezza dell'assegnazione di massa con appartenenza ai rapporti

Così ho tre modelli:

  • utente
  • postale: appartiene ad un utente e una categoria
  • categoria: appartiene all'utente

I consentire l'assegnazione di massa su category_id, in modo che l'utente possa annullarlo, c portatelo a una delle loro categorie, o attraverso l'assegnazione di massa, suppongo che potrebbero cambiarlo nella categoria di qualcun altro. È qui che non sono sicuro di quale sarebbe il modo migliore di procedere.

Le risorse che ho esaminato (in particolare railscast #178 e un resource fornito da quel railscast), entrambe menzionano che l'associazione non dovrebbe essere assegnabile in serie, il che ha senso. Non so esattamente in che altro modo consentire all'utente di modificare ciò che la categoria del post sarebbe in un modo railsy.

Qualche idea sul modo migliore per risolvere questo? Lo sto guardando nel modo sbagliato?

UPDATE: Spero di chiarire la mia preoccupazione un po 'di più.

Diciamo che sono in post, ho bisogno qualcosa come il seguente:

def create 
    @post = Post.new(params[:category]) 

    @post.user_id = current_user.id 

    # CHECK HERE IF REQUESTED CATEGORY_ID IS OWNED BY USER 

    # continue on as normal here 
end 

che sembra un sacco di lavoro? Avrei bisogno di controllarlo su tutti i controller sia nell'aggiornamento che nella creazione di azioni. Tieni presente che c'è più di una sola proprietà_della relazione.

risposta

0

OK, quindi cercato un po 'intorno, e finalmente è venuto fuori qualcosa di lavorabile per me.Ho come tenere la logica fuori dai controllori ove possibile, in modo da questa soluzione è una soluzione basata su modelli:

# Post.rb 
validates_each :asset_category_id do |record, attr, value| 
    self.validates_associated_permission(record, attr, value) 
end 

# This can obviously be put in a base class/utility class of some sort. 
def self.validates_associated_permission(record, attr, value) 
    return if value.blank? 
    class_string = attr.to_s.gsub(/_id$/, '') 
    klass = class_string.camelize.constantize 

    # Check here that the associated record is the users 
    # I'm leaving this part as pseudo code as everyone's auth code is 
    # unique. 
    if klass.find_by_id(value).can_write(current_user) 
    record.errors.add attr, 'cannot be found.' 
    end 
end 

Ho anche scoperto che Rails 3.0 avrà un modo migliore per specificare questo invece delle 3 linee necessarie per la ultra generic validates_each.

http://ryandaigle.com/articles/2009/8/11/what-s-new-in-edge-rails-independent-model-validators

+0

Un'altra risposta è stata molto utile, ma questo è ciò che ha effettivamente risolto il mio problema, quindi lo accetto. – dpb

5

L'utente può modificarlo tramite un modulo di modifica di qualche tipo, presumo.

In base a ciò, l'Assignment di massa è davvero per tipi nefandi che cercano di fare confusione con la tua app attraverso cose come curl. Li chiamo bambini arruffati.

Tutto questo per dire, se si utilizza attr_protected - (qui si inseriscono i campi che non si desidera vengano modificati) o il preferito del bambino attr_accessible (i campi che sono OK per cambiare).

Sentirete argomenti per entrambi, ma se si utilizza attr_protected :user_id nel modello, e poi nelle vostre CategoryController # creare azione che si può fare qualcosa di simile

def create 
    @category = Category.new(params[:category]) 

    @category.user_id = current_user.id 
    respond_to do |format| 
....#continue on as normal here 
end 
+0

Grazie @pjammer. Sono particolarmente interessato all'esempio sopra. Quello che hai scritto è corretto, ma sono più interessato all'appartenenza da Post a Categoria. Ho già qualcosa di simile (anche se ce l'ho nel modello) per l'utente corrente su Post e Categoria. – dpb

Problemi correlati