2011-12-09 1 views
10

In guide in http://edgeguides.rubyonrails.org/security.html, paragrafo 6.1, introduce un ruolo per attr_accessible con: in opzione,Dove e come assegnare un utente: ruolo admin per attr_accessible in rails 3.1?

attr_accessible :name, :is_admin, :as => :admin 

La mia domanda è, se un utente l'accesso, dove e come posso assegnare l'utente a: admin ruolo cosicché lei/lui abbia il diritto all'assegnazione di massa con attr_accessible? Posso anche definire il mio ruolo come group_to_update? Se sì, cosa dovrebbe andare nella definizione di group_to_update?

Grazie.

risposta

32

Si sta utilizzando una terminologia tecnica in modo vago che rende confusa la comprensione di questo processo, quindi chiarirò prima questa terminologia.

dove e come posso assegnare l'utente a: ruolo di amministratore

Il 'ruolo' utilizzato nel parametro :as a attr_accessible non è un ruolo utente. È un attributo attributo. Significa che l'attributo è protetto dalla sovrascrittura a meno che tale ruolo non sia specificato nell'istruzione che imposta l'attributo. Quindi, questo sistema è indipendente da qualsiasi sistema utente. La tua applicazione non ha nemmeno bisogno di avere utenti per avere ruoli nell'assegnazione di massa.

posso definire il mio ruolo come group_to_update

ruoli non sono realmente "definiti" in ogni senso formale a tutti. In ogni luogo in cui è previsto un ruolo, è sufficiente utilizzare qualsiasi simbolo/stringa (ad esempio :group_to_update) come ruolo. Non c'è bisogno di specificarlo altrove prima del tempo.

Ecco come funziona. Normalmente, durante l'assegnazione di massa di un hash per modellare gli attributi, tutti gli attributi del modello vengono usati come chiavi per l'hash assegnato.Quindi, se si dispone di un modello Barn e barn istanza di esso, con tre attributi horse, cat, e rabbit, allora questo:

barn.attributes = params 

è essenzialmente lo stesso di fare:

barn.horse = params[:horse] 
barn.cat = params[:cat] 
barn.rabbit = params[:rabbit] 

Ora, se imposti qualsiasi attr_accessible sul modello della stalla, solo gli attributi che hai impostato verranno aggiornati quando si utilizza l'assegnazione di massa. Esempio:

class Barn < ActiveRecord::Base 
    attr_accessible :cat 
    attr_accessible :rabbit 
end 

Allora questo:

barn.attributes = params 

farà solo questo:

barn.cat = params[:cat] 
barn.rabbit = params[:rabbit] 

Perché solo 'gatto' e 'coniglio' sono impostati accessibile ('cavallo' non è). Ora potresti chiamare un ruolo come questo attributo:

class Barn < ActiveRecord::Base 
    attr_accessible :cat 
    attr_accessible :rabbit, :as => :banana 
end 

In primo luogo, si noti che il ruolo può da tutto quello che vuoi fintanto che si tratta di un simbolo/string. In questo caso, ho assunto il ruolo :banana. Ora, quando si imposta un ruolo su un attributo attr_accessible, normalmente non viene assegnato. Questo:

barn.attributes = params 

ora solo fare questo:

barn.cat = params[:cat] 

ma è possibile assegnare gli attributi con un ruolo specifico utilizzando il metodo assign_attributes. Così si può fare:

barn.assign_attributes(params, :as => :banana) 

Ciò assegnare tutti params normalmente protetti così come tutti params protette in virtù del ruolo :banana:

barn.cat = params[:cat] 
barn.rabbit = params[:rabbit] 

Quindi consideriamo un esempio più lungo con più attributi:

class Barn < ActiveRecord::Base 
    attr_accessible :cat 
    attr_accessible :rabbit, :as => :banana 
    attr_accessible :horse, :as => :banana 
    attr_accessible :cow, :as => :happiness 
end 

Quindi è possibile utilizzare tali ruoli quando si assegnano attributi. Questo:

barn.assign_attributes(params, :as => :banana) 

corrisponde a:

barn.cat = params[:cat] 
barn.rabbit = params[:rabbit] 
barn.horse = params[:horse] 

E questo:

barn.assign_attributes(params, :as => :happiness) 

corrisponde a:

barn.cat = params[:cat] 
barn.cow = params[:cow] 

Ora, se si sceglie di , puoi creare ruoli utente (ad es. una colonna "ruolo" sul modello utente) corrisponde ai ruoli attributo su qualsiasi modello.Così si potrebbe fare qualcosa di simile:

barn.assign_attributes(params, :as => user.role) 

Se ruolo che questo user s' sembra essere banana, quindi (usando il nostro ultimo esempio modello) sarà impostare gli attributi sul granaio per il gatto, coniglio, e il cavallo. Ma questo è solo un modo per usare i ruoli degli attributi. Spetta interamente a te se vuoi usarli in un modo diverso.

+3

+1 Ottima risposta. – Gazler

+0

Grazie. Probabilmente è l'unico post che entra nel grande dettaglio del ruolo in attr_accessible. Ancora una domanda: in che modo il ruolo impedirà l'assegnazione di massa? Non c'è modo per un hacker di includere il ruolo nell'URL? – user938363

+0

Ottima risposta. Questo dovrebbe essere da qualche parte [nelle guide?] Nei documenti di Rails. – maprihoda

3

Questo serve per proteggere l'assegnazione di massa come spiegato dal collegamento.

Nelle guide (per l'aggiornamento), ciò ha effetto solo sulla chiamata update_attributes. Puoi ancora usare update_attribute o admin = metodi per assegnare la variabile admin.

User.first.update_attributes(:name => "Gazler", :admin => true) #this will not work 
User.first.update_attribute(:admin, true) #This will work 

#This will also work 
user = User.first 
user.admin = true 
user.save 

Si potrebbe voler dare un'occhiata a utilizzando uno gem for your permissions. Cancan è probabilmente il più comune.

+0

Qui hai utilizzato l'incarico individuale che dovrebbe funzionare sempre. Ma chi potrebbe essere il ruolo di amministratore e come diventare un ruolo di amministratore? Presumo che admin sia un metodo che potrebbe essere definito. – user938363

+0

No, l'amministratore in questo caso sarebbe una proprietà sul modello utente. Puoi assegnarlo nella console di rails o attraverso un modulo come qualsiasi altra proprietà. – Gazler

1

Vedere il metodo assign_attributes.

In breve, consente di assegnare gli attributi solo quando si passa anche il ruolo. I documenti hanno esempi di codice molto belli e facilmente comprensibili. In un certo senso, funziona come una sorta di filtro o guardia.