Je pense que vous devez mettre en place un mécanisme d'autorisation.
La meilleure gemme que je connaisse est declarative_authorization. Je l'ai personnellement utilisé sur un environnement de production, et j'en suis satisfait. Il y a aussi un railscast à ce sujet. L'idée est de déclarer dans un fichier spécifique (config/authorization_rules.rb
) les "rôles et permissions". Vous dites des choses comme «un gestionnaire peut lire uniquement les clients qui lui sont associés» ou «un administrateur peut lire et écrire tous les utilisateurs». Dans votre cas, il ressemblerait à ceci:
authorization do
role :guest do
# actions here can be done by everyone, even not logged in people
end
role :user do
includes :guest
# actions here can be done by logged people
end
role :manager do
includes :user #managers do everything users do, plus:
has_permission_on :sales_region, :to => :read do
if_attribute :id => is_in {user.sales_region_ids}
end
has_permission_on :users, :to => [:update, :read] do
if_attribute :id => is {user.user_ids_by_sales_region} #defined on the model
end
end
role :admin do
includes :user
has_permission_on [:sales_regions, :users], :to :manage
end
end
privileges do
privilege :manage do
includes :create, :read, :update, :delete
end
end
Une fois que cela est spécifié, vous devez modifier vos modèles afin qu'ils utilisent declarative_authorization
. En outre, nous allons définir la méthode user_ids_by_sales_region
class User < ActiveRecord::Base
using_access_control # this enables DA
def users_by_sales_region
sales_regions.collect{ |sr| sr.users }.flatten.uniq
end
def user_ids_by_sales_region
users_by_sales_region.collect{ |u| u.id }
end
end
Vous devez également avoir une méthode current_user
, et un moyen d'obtenir le rôle de l'utilisateur actuel (s). Reportez-vous à la section "Fourniture des exigences du plug-in" sur le readme.
Ensuite, vous pouvez faire ce que vous voulez avec with_permissions_to
:
manager = User.find(...)
manager.users.with_permissions_to(:read) # the users from his region
manager.users.with_permissions_to(:read).find(:all, conditions => { :active => true })
manager.users.with_permissions_to(:write) #returns no users, managers can't edit them
admin = User.find(...)
admin.users.with_permissions_to(:write) #will return all users
Cela signifie un peu d'effort au début, mais simplifie l'application beaucoup plus tard. En outre, vous disposez de fonctionnalités supplémentaires, telles que masquer/afficher des parties de vues en fonction des autorisations de l'utilisateur actuel, ainsi que d'interdire l'accès à des actions de contrôleur spécifiques.
En outre, il devrait fonctionner très bien avec paginations, etc.
Il y a un autre petit bijou d'autorisation déclarative appelé cancan. Je n'ai pas d'expérience avec celui-ci, mais si c'est fait par Ryan Bates, ça doit être bon (il a aussi un railscast pour ça).Cependant, je ne pense pas que cela permette des extensions de modèles, ce dont vous semblez avoir besoin maintenant.
Merci pour votre réponse, ressemble certainement à un excellent plugin. J'ai finalement essayé de déclarer named_scopes sur les modèles qui nécessitaient une restriction, de sorte qu'ils pouvaient être accédés en utilisant (par exemple) User.visible_to (@current_user) ou Account.visible_to (@current_user) .in_sales_area (3). Je vais poster un exemple de code ci-dessous. Merci encore! –