12
votes

Utilisation de CANCAN pour empêcher l'accès au contrôleur

J'ai un contrôleur d'administrateur et je souhaite que seuls les utilisateurs qui sont définis comme administrateur auraient accès à ce contrôleur.

Ma classe de capacité: P>

class AdminController < ApplicationController
  load_and_authorize_resource

  def index
  end

  def users_list
  end
end


0 commentaires

5 Réponses :


3
votes

Vérifiez ceci pour ajouter des règles d'autorisation pour les contrôleurs non reposants:

https://github.com/ryanb/cancan/wiki/non- Contrôleurs reposants

J'espère que cela aide.


0 commentaires

30
votes

Ceci est parce que lorsque vous utilisez load_and_authorize_resource Votre contrôleur doit être soutenu par un modèle nommé admin (puisque votre contrôleur est appelé Admincontroller). Ainsi, vous devez soit créer ce modèle, soit remplacer load_and_authorize_resource avec:

AUTORIZE_RESOURCE: CLASS => FALSE

qui provoque des contrôles d'accès contre vos actions plutôt que sur le modèle. Remarque Cela fait malheureusement que cela provoque malheureusement les symboles d'accès génériques tels que : gérer et : lisez pour arrêter de travailler vous obligeant à faire référence aux actions du contrôleur directement dans capable.rb :

peut [: index ,: users_list] ,: admin

où le premier argument est une gamme d'actions de contrôleur, l'utilisateur peut accéder et le deuxième argument est le nom abrégé du contrôleur


1 commentaires

Bonjour, Et si je veux diviser la ressource façonnée par des types. Par exemple, j'ai de nombreux rapports dans mes projets, mais pas de modèles pour eux. Différentes vues vont à la même action Build dans reports_controller.rb avec nom de rapport spécifique. J'essaie de définir des capacités comme ceci: peut: lire,: rapports, nom: ['commandes', 'paiements'] , puis vérifier les autorisations: si peut? : LIRE,: RAPPORTS, NOM: 'COMMANDES' Mais ERROR MÉTHODE INDERFINÉE "Nom" pour: Rapports: Symbole est arrivé. Avez-vous des idées?



1
votes

Ceci est dû au fait que lorsque vous effectuez un contrôleur générique, mettez LOAD_AND_AUTHORIZE_RESOURCE.RESOURCE, le contrôleur d'application ou le contrôleur d'administrateur n'a pas pu trouver la classe actuelle qu'il vient de comme cet exemple. Cela fonctionnera.

class Admin::HomeController < Admin::ApplicationController
    def home    
    end
  end

  class Admin::ApplicationController < ApplicationController
    load_and_authorize_resource :class => self.class
  end


0 commentaires

6
votes

Vous pouvez mettre l'autorisation dans votre contrôleur

can :manage, :controller_name


0 commentaires

0
votes

J'ai eu le même problème. Ma solution a été définie une capacité impossible. Déséquilibre de définir ce que seul l'administrateur peut faire, je défini ce que l'utilisateur Aucun administrateur ne peut pas faire. Dans votre code serait quelque chose comme ceci:

Contrôleur d'administrateur: xxx

capacité.rb: xxx


0 commentaires