2010-04-19 4 views
3

J'essaie d'ajouter une autorisation à une application assez grande qui existe déjà, mais je dois masquer un peu les détails.autorisations d'autorisation déclarative sur les rôles

Voici le fond:

Dans notre application, nous avons un certain nombre ou des rôles qui sont hiérarchiques, à peu près comme ceci:

BasicUser -> SuperUser -> Admin -> SuperAdmin 

Pour autorisation chaque instance de modèle utilisateur a un attribut « rôle » ce qui correspond à ce qui précède.

Nous avons un contrôleur RESTful "Users" qui est namespaced sous Backoffice. Bref, c'est Backoffice :: UsersController.

class Backoffice::UsersController < ApplicationController 
    filter_access_to :all 
    #... RESTful actions + some others 
end 

Alors, voici le problème:

Nous voulons que les utilisateurs soient en mesure de donner des autorisations pour les utilisateurs d'éditer des utilisateurs mais seulement si elles ont un rôle « plus petit » que ce qu'ils ont actuellement. J'ai créé ce qui suit dans authorization_rules.rb

authorization do 
    role :basic_user do 
    has_permission_on :backoffice_users, :to => :index 
    end 
    role :super_user do 
    includes :basic_user 
    has_permission_on :backoffice_users, :to => :edit do 
     if_attribute :role => is_in { %w(basic_user) } 
    end 
    end 
    role :admin do 
    includes :super_user 
    end 
    role :super_admin do 
    includes :admin 
    end 
end 

Et malheureusement, c'est aussi loin que je suis arrivé, la règle ne semble pas s'appliquer.

  1. Si je commente la règle sur, personne ne peut modifier
  2. Si je laisse la règle que vous pouvez modifier tout le monde

J'ai aussi essayé quelques variations sur le if_attribute:

if_attribute :role => is { 'basic_user' } 
if_attribute :role => 'basic_user' 

et ils obtiennent le même effet. Quelqu'un a-t'il des suggestions?

Répondre

0

je l'approche suivante dans mon application et il fonctionne

role :super_user do 
    includes :basic_user 
    has_permission_on :backoffice_users do 
     to :edit 
     if_attribute :role => is {"basic_user"} 
    end 
end 
4

Je suis sûr que vous avez résolu ce problème maintenant, mais nous avons juste eu un problème similaire et appuyez sur une solution qui peut être de quelques-uns Aidez-moi. Il peut ne pas être possible de traiter le cas purement dans l'autorisation déclarative DSL, mais vous pouvez tirer parti de la DSL pour faire la bonne chose dans vos modèles et vues. Fondamentalement, nous avions besoin d'accéder au graphe de la hiérarchie des rôles. L'indice est que l'autorisation déclarative possède un contrôleur astucieux qui produit un graphique montrant la hiérarchie de vos rôles. En utilisant le même code de soutien qu'ils ont, vous pouvez facilement accéder aux ancêtres de tout rôle ainsi:

class Role < ActiveRecord::Base 
    require 'declarative_authorization/development_support/analyzer' 

    has_many :assignments 
    has_many :users, :through => :assignments 

    validates :name, :presence => true 
    validates :name, :uniqueness => true 

    def ancestors 
    Authorization::DevelopmentSupport::AnalyzerEngine::Role.for_sym(self.name.to_sym, 
     Authorization::Engine.instance).ancestors.map { |r| r.instance_variable_get("@role") } 
    end 

    def self_and_ancestors 
    ancestors << self.name.to_sym 
    end 
end 

Vous pouvez alors l'utiliser pour faire des choses comme offrir uniquement des sélections de rôle dans l'éditeur de l'utilisateur qui sont identiques ou inférieurs à Le rôle de current_user et également refuser l'accès ou ne pas autoriser le changement du modèle à quelqu'un qui essaie de promouvoir un utilisateur de façon inappropriée. Ce n'est pas très utile dans le contexte de l'autorisation déclarative DSL elle-même car il faudrait d'abord l'analyser, en créant une sorte de référence circulaire.

J'espère que cela aidera tous ceux qui en ont besoin.

Questions connexes