2010-08-23 4 views
2

Je devrai fournir des attributions de rôles dynamiques (Rôles/Privilèges). Plus clairement, un utilisateur final devrait être capable de créer un rôle, d'attribuer des permissions à un nouvel utilisateur. Je pensais donc à stocker les rôles et les privilèges dans une table pour chaque utilisateur.Autorisation de rôle dynamique dans Rails à l'aide d'une base de données. Autorisation déclarative le meilleur choix?

Existe-t-il une manière intelligente de faire ceci (n'importe quel autre module?), Ou ou devrais-je écrire le code pour faire ceci avec l'autorisation déclarative. Un peu de lumière aiderait. Merci!

Répondre

1

Essayez de répondre à ces pour se rapprocher d'une solution:

  1. Les rôles eux-mêmes dynamiques? C'est-à-dire que les privilèges attribués aux divers rôles peuvent être modifiés par l'intermédiaire de l'interface Web par un administrateur? Si oui, alors vous devriez stocker cette information dans votre base de données. Pour un système comme un blog, où les rôles sont prédéfinis, par exemple. Admin, Invité et Modérateur, Autorisation Déclarative fonctionne comme un charme.
  2. Quelle est la force du couplage des autorisations à l'interface utilisateur? (Parfois, il suffit de restreindre certains endroits, dans d'autres cas, comme un réseau social, les autorisations sont beaucoup plus complexes et étroitement liées à l'interface utilisateur). Si son action est très étroitement liée, c'est-à-dire qu'une action est disponible pour toutes sortes de rôles, mais que les actions effectuées par ces rôles sont limitées par leur définition, alors l'autorisation déclarative (ou les goûts) n'aidera pas beaucoup, vous avez besoin d'un système hérité.
+0

Je sais que c'est vraiment vieux, mais pourriez-vous vous étendre sur un système existant? –

+1

Par système existant, je veux dire une base de code ou un ensemble de règles propre à la plate-forme que l'OP est en train de construire. Par exemple Dans l'un de nos produits, il y a 'DispatchManager',' AccountContact' et 'SalesExecutive' qui ont tous des privilèges et des rôles différents dans différentes parties de l'application. Donc, le système de règles que je construis pour cela serait appelé système hérité. – Swanand

1

J'ai récemment utilisé CanCan dans un projet et je pense que c'était plutôt cool. Vous créez une classe Ability et l'utilisez pour décider si l'utilisateur peut effectuer l'action ... Vous pouvez vérifier l'existence d'autorisations dans une table de la méthode ou si leur jeu de règles autorise l'action.

Je pris tout ce code d'échantillon du readme github:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    if user.admin? 
     can :manage, :all 
    else 
     can :read, :all 
    end 
    end 
end 

Puis dans vos vues et votre contrôleur, vous pouvez vérifier les niveaux d'autorisation

<% if can? :update, @article %> 
    <%= link_to "Edit", edit_article_path(@article) %> 
<% end %> 


def show 
    @article = Article.find(params[:id]) 
    authorize! :read, @article 
end 
1

Cancan est idéal pour de simples/projets à partir mais vous devriez certainement envelopper si vous avez une application monolithique. Cancan devrait être une solution rapide mais pas définitive. Si vous regardez des objets politiques (pundit), il peut s'agir d'une odeur de code dont vous avez besoin pour créer votre propre modèle d'autorisation. L'autorisation comme l'intégration varie d'un client à l'autre et si vous cherchez des solutions plus dynamiques ou si vous avez trop de rôles, Cancan n'est pas pour vous. Vous pourriez avoir besoin d'un modèle de sécurité plus axé sur les données. Par exemple, si vous pouvez accorder l'accès à une entité à quelqu'un d'autre.

Questions connexes