Usando: attr_accessible con l'autorizzazione basata sui ruoli
-
16-09-2019 - |
Domanda
Nel mio negozio on-line, gli utenti sono autorizzati a modificare alcune proprietà dei loro ordini (ad esempio, il loro indirizzo di fatturazione), ma non in altri (ad esempio, l'indirizzo IP origine). Gli amministratori, d'altra parte, sono autorizzati a modificare le tutti proprietà di ordine.
Dato, questo, come posso usare :attr_accessible
di rendere sicure mio modello Ordine? Oppure dovrò usarlo per marcare accessibili tutti gli attributi che gli amministratori possono modificare e astenersi dall'utilizzare Order.update_attributes(params[:order])
in quelle azioni di controllo che gli utenti normali possono accedere?
Soluzione
In generale, attr_accessible non è lo strumento che stai cercando e Rails non viene fornito con tutto ciò costruito in che fa ciò che si vuole.
Se si vuole un controllo dettagliato su chi può aggiornare attributi specifici in un modello, si potrebbe fare qualcosa di simile:
class Order < ActiveRecord::Base
def update_attributes_as_user(values, user)
values.each do |attribute, value|
# Update the attribute if the user is allowed to
@order.send("#{attribute}=", value) if user.can_modify?(attribute)
end
save
end
end
Poi si può cambiare la vostra Order.update_attributes(params[:order])
per Order.update_attributes_as_user(params[:order], current_user)
e supponendo che si implementa il metodo User#can_modify?
per restituire vero nei casi corretti, dovrebbe funzionare.
Altri suggerimenti
Ho avuto lo stesso problema e ora sto usando questo gioiello http://github.com/dmitry/ attr_accessible_block
E 'facile e utilizzato in alcuni siti di produzione.
Sì, dovrete modificare le azioni, quindi le autorizzazioni vengono controllati all'interno delle azioni. Chiamando Order#update_attributes
non funziona per l'utente generale.
Non riesco a rember un plugin di autorizzazione basata sui ruoli che permetterebbe qualcosa che si sta cercando. Questo è perché questi plugin MixIn ai controller e non i modelli. Avrebbero anche bisogno di mixin in ActiveRecord::Base
per verificare attr_accesible
etc.