1

Je suis encore assez nouveau pour les rails et activerecord, alors s'il vous plaît excuser tous les oublis.Rails créant des utilisateurs, des rôles, et des projets

J'ai 3 modèles que j'essaie de lier ensemble (et un 4ème pour faire le lien) pour créer un schéma d'autorisation en utilisant des rôles définis par l'utilisateur.

class User < ActiveRecord::Base 
    has_many :user_projects 
    has_many :projects, :through => :user_projects 
    has_many :project_roles, :through => :user_projects 
end 

class Project < ActiveRecord::Base 
    has_many :user_projects 
    has_many :users, :through => :user_projects 
    has_many :project_roles 
end 

class ProjectRole < ActiveRecord::Base 
    belongs_to :projects 
    belongs_to :user_projects 
end 

class UserProject < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :project 
    has_one :project_role 
    attr_accessible :project_role_id 
end 

Le modèle project_roles contient un nom de rôle défini par l'utilisateur, et booléens qui définissent si le rôle donné a des autorisations pour une tâche spécifique. Je suis à la recherche d'une solution élégante pour référencer cela n'importe où dans le projet de mon application facilement.

J'ai déjà un système de rôle implémenté pour l'ensemble de l'application. Ce que je cherche vraiment, c'est que les utilisateurs seront capables de gérer leurs propres rôles au cas par cas. Chaque projet est configuré avec un rôle d'administrateur par défaut immuable et le créateur du projet est ajouté lors de la création du projet. Puisque les utilisateurs créent les rôles, j'aimerais pouvoir extraire une liste de noms de rôles du projet et des modèles d'utilisateurs par association (à des fins d'affichage), mais pour tester l'accès, je voudrais simplement faire référence eux par ce qu'ils ont accès sans les référencer par leur nom.

Peut-être que quelque chose comme ça?

def has_perm?(permission, user) # The permission that I'm testing 
    user.current_project.project_roles.each do |role| 
    if role.send(permission) # Not sure that's right... 
     do_stuff 
    end 
    end 
end 

Je pense que je suis dans ma tête sur celui-ci parce que je continue à tourner en rond sur la meilleure façon que je peux mettre en œuvre.

Répondre

1

La meilleure façon de l'implémenter est de ne pas l'implémenter. Je suggère d'utiliser l'une des nombreuses gemmes déjà créées pour vous aider avec les utilisateurs, les rôles et les permissions. Par exemple:

acl9 
http://github.com/be9/acl9 

acl9 vous donne un peu DSL vous pouvez utiliser pour ajouter des autorisations et des rôles aux utilisateurs. Il est vraiment facile à configurer et vous évitera d'avoir à écrire le code vous-même.

acl9 fonctionne très bien avec autorisation (http://github.com/thoughtbot/clearance) pour l'authentification.

+0

J'ai mis à jour la question dans l'espoir de clarifier un peu. J'ai regardé quelques gemmes, et elles ne semblent pas vraiment convenir. La raison en est que je ne serai pas capable de référencer l'accès en fonction du nom du rôle parce que je ne connaîtrai jamais le nom du rôle. Le nom sera à des fins d'affichage seulement. Connaissez-vous une gemme ou peut-être une autre solution qui peut gérer ce genre de comportement? Je sens que je suis déjà proche, c'est presque fonctionnel, mais pas très élégant. :) –

0

Je suis d'accord avec jonnii mais je vous conseille de jeter un oeil à cancan de Ryan Bates

Je pense qu'il est beaucoup plus simple à mettre en œuvre et à utiliser.

+0

Cancan ne stocke cependant pas les privilèges des utilisateurs sur la base de données. –

Questions connexes