2

J'ai joué avec la gemme de CanCanCan pour limiter les actions d'un utilisateur régulier, mais jusqu'ici je n'ai réussi qu'à limiter les autorisations à un modèle entier, et ce dont j'ai vraiment besoin est de limiter l'accès certains de ses attributs. Par exemple, sur mon modèle Utilisateur, en plus de l'utilisateur/mot de passe/email, j'ai un booléen pour admin, que j'utilise pour valider le statut de l'utilisateur connecté, auquel cas si user.admin ?, il peut accéder à/gérer tout, sinon, il devrait être capable de lire tout, et ne peut mettre à jour son propre enregistrement si le user.id correspond.CanCanCan: autoriser/interdire des attributs de modèle spécifiques

J'ai lu la documentation et à travers pour travers de nombreuses fois, le plus proche je suis arrivé ajoutais cette app/modèles/ability.rb

can :update, :users, [:name, :password, :email] 

qui ne fait rien.

Ainsi,

Le problème: L'utilisateur peut soit: mettre à jour le modèle entier, ou tout simplement: lire, je ne peux pas le mettre à: mettre à jour ou: lire les attributs spécifiques.

Ce dont j'ai besoin: L'utilisateur à capable de: modifier uniquement les attributs spécifiques.

La question: Quelle est la syntaxe correcte pour limiter les attributs? Y at-il une autre configuration que je dois définir sur d'autres fichiers?

Mon fichier Ability.rb:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 
    if user.admin? 
     can :manage, :all 
     can :import, [User, Enclosure, Blade, Component] 
    else 
     can :access, :rails_admin 
     can :dashboard 
     can :read, :all 
     can :history, :all 
     # Allows user to only edit an enclosure, if it's allocated to itself, or not allocated at all 
     can :update, Enclosure do |enclosure| 
     can :update, Enclosure if (enclosure.allocated_to == user.email && enclosure.allocation == true) || enclosure.allocation == false 
     end 
    end  
    end 
end 

Gems J'utilise (en plus des 4 gemmes par défaut Rails):

# Administration Panel Gems 
gem 'rails_admin'     # Rails Administration Panel Gem 
gem 'rails_admin_history_rollback' # Enables users to visualize and revert history 
gem 'rails_admin_import', "~> 1.0.0" # Enables importing 
gem 'devise'       # Authentication Gem 
gem 'cancancan'      # Authorization Gem 
gem 'paper_trail', '~> 4.0.0.rc'  # Auditing Gem (History) 

Merci!

Répondre

5

Je pense que vous devriez utiliser strong parameters. Cette gemme vous permet de choisir les paramètres que vous voulez mettre à jour. Si vous utilisez Rails 4, la gemme est déjà installée, sinon you can install it.

class UsersController < ApplicationController 
    load_and_authorize_resource 

    def update 
    if @user.update_attributes(update_params) 
     # hurray 
    else 
     render :edit 
    end 
    end 

    private 

    def update_params 
    if current_user.admin? 
     params.require(:user).permit(:user, :email, :password, :admin) 
    else 
     params.require(:user).permit(:user, :email, :password) 
    end 
    end 
end