0

Je construisais un système de gestion des rôles utilisateur. Il a un modèle Permission et un modèle Role. Role has_many permissions et User has_many roles. Nous avons donc besoin de CRUD pour permsissions et roles.Gestion des rôles basée sur les routes dans les rails

Je pense à une approche différente. Que diriez-vous de prendre toutes les routes dans mon application et de créer des permissions sur ?? Fondamentalement, les permissions sont des autorisations pour aller à un chemin, et nous avons une liste de chemins dans les routes.

j'ai pu obtenir toutes les routes dans mon application comme

Rails.application.routes.routes.to_a 

Mais je ne pouvais pas voir cette approche mise en œuvre partout. Que pensez-vous de ceci? S'il vous plaît partagez vos suggestions. Merci d'avance.

Répondre

0

Je pense que ce que vous décrivez est le cas d'utilisation parfait pour cancancan. Avec elle, vous définissez une classe de capacité

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    # See the wiki for details: 
    # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities 
    if user.admin? 
     can :manage, :all 
    elsif user.contributor? 
     can :manage, [Post] 
    else 
     can :read, :all 
    end 
    end 
end 

qui peut ensuite être utilisé pour contrôler l'accès au niveau du contrôleur

class PostsController < ActionController::Base 
    load_and_authorize_resource 
end 

Cela permettra admins et collaborateurs d'accéder à toutes les actions (depuis les administrateurs peuvent gérer toutes les ressources pendant que les contributeurs peuvent gérer les messages) tandis que les autres utilisateurs n'auront accès qu'à read seulement les actions (index, show). Vous pouvez bien sûr contrôler l'accès au niveau des ressources aussi.

+0

Merci pour la réponse @bart. Mais comment puis-je ajouter une capacité de l'utilisateur autre que de le coder? Je le veux comme un administrateur peut sélectionner quelques autorisations d'une liste de contrôle et les enregistrer en tant que rôle, de sorte que les utilisateurs peuvent se voir attribuer ces rôles. Est-il possible d'utiliser Cancancan? – mukesh

+0

cancancan est spécifiquement centré autour des * capacités * d'un utilisateur particulier. Comment ces capacités sont définies est à vous. Cela étant dit, vous pouvez facilement l'adapter à vos besoins. Par exemple, dans la classe de capacités, vous pouvez faire ce qui suit 'si user.role.permissions.include? (: Whatever)' pour décider à quelles ressources l'utilisateur a accès. –

0

Si vous souhaitez imposer une autorisation par route, créez des méthodes pour chaque rôle dans application_controller qui vérifie si l'utilisateur dispose de l'autorisation correspondante et redirige ou whatsover. Utilisez-le sur before_action de vos contrôleurs et actions souhaités.

+0

Cela rend les choses difficiles lorsque vous ajoutez un nouveau rôle, car vous devrez écrire un code pour cela. N'est-ce pas? – mukesh

+0

Si vous voulez entrer dans chaque contrôle d'accès au niveau de l'itinéraire oui. Si un nouveau rôle arrive, il suffit d'ajouter à before_action où vous voudriez restreindre. Avec de petits ajustements, vous n'avez pas besoin d'écrire une méthode individuelle pour des rôles individuels. – avinoth

+0

Cela me fait écrire du code chaque fois que j'ajoute un itinéraire. Je veux un administrateur pour sélectionner les autorisations d'une interface utilisateur, sans l'aide d'un développeur. – mukesh

0

Avez-vous vérifié https://github.com/ryanb/cancan? Avec cette gemme, vous pouvez définir des rôles dans plusieurs modèles et gérer des ressources interdites

+0

Comment autoriser un utilisateur à ajouter/modifier des autorisations dans un rôle et à l'attribuer à un utilisateur utilisant cancan? ou, comment puis-je générer des capacités à partir de la fin de l'utilisateur? – mukesh

+0

@mukesh si vous avez un champ d'autorisation dans le modèle, même dans une autre table, vous pouvez l'utiliser et combiner avec cancan comme vous l'a dit Bart Jedrocha auparavant. – letz