Question

Dans mon magasin en ligne, les utilisateurs sont autorisés à modifier certaines propriétés de leurs ordres (par exemple, leur adresse de facturation), mais pas dans d'autres (par exemple, l'adresse IP d'origine). Les administrateurs, d'autre part, sont autorisés à modifier tous propriétés d'ordre.

Étant donné, cela, comment puis-je utiliser :attr_accessible pour sécuriser correctement mon modèle de commande? Ou vais-je utiliser pour marquer accessible tous les attributs que les administrateurs peuvent modifier et ne pas utiliser Order.update_attributes(params[:order]) dans les actions du contrôleur que les utilisateurs ordinaires peuvent accéder?

Était-ce utile?

La solution

D'une manière générale, attr_accessible est pas l'outil que vous recherchez et Rails ne vient pas avec quoi que ce soit construit qui fait ce que vous voulez.

Si vous voulez un contrôle fin sur qui peut mettre à jour des attributs spécifiques dans un modèle, vous pouvez faire quelque chose comme:

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

Ensuite, vous pouvez changer votre Order.update_attributes(params[:order]) à Order.update_attributes_as_user(params[:order], current_user) et en supposant que vous mettre en œuvre la méthode User#can_modify? pour revenir vrai dans les cas corrects, il devrait fonctionner.

Autres conseils

J'ai eu le même problème et maintenant je suis en utilisant ce petit bijou http://github.com/dmitry/ attr_accessible_block

Il est facile et utilisé dans certains sites de production.

Oui, vous devrez modifier les actions, les permissions sont vérifiées dans les actions. Order#update_attributes L'appel ne fonctionne pas pour l'utilisateur général.

Je ne peux pas Rember un plugin d'autorisation basée sur les rôles qui permettrait à quelque chose que vous recherchez. En effet, ces plug-ins MIXIN aux contrôleurs et pas les modèles. Ils doivent également mixin en ActiveRecord::Base pour vérifier attr_accesible etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top