2010-01-25 4 views
2

J'utilise le plugin d'autorisation CanCan (http://github.com/ryanb/cancan) pour mon application et cela a fonctionné jusqu'à maintenant. Je l'ai fait définir comme suit:Rails CanCan Auth Problème

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user 

    if user.role == "admin" 
     can :manage, :all 
    else 
     can :read, :all 


    end 
    end 
end 

Cela me permet de désigner des utilisateurs Administrateurs et seulement ils peuvent accéder aux fonctions d'écriture. Maintenant, je veux prendre une autre étape et faire en sorte que les gens qui ne sont pas connectés du tout (current_user/user_session n'existe pas) ne peuvent pas accéder à certains contrôleurs du site. Je sais que ce devrait être une sorte de elsif avec la partie centrale du code pour l'utilisateur et le reste pour tout le monde. Cependant, je n'ai pas été en mesure de trouver la meilleure façon d'y arriver. Quelqu'un connaît CanCan et a des idées sur la meilleure façon d'aborder ce genre de situation.

Merci les gars, chaque bit m'aide à en savoir plus sur les rails et le développement en général!

Répondre

4

Je ne suis pas assez familier avec Cancan, mais ce genre de logique appartient à l'intérieur du contrôleur spécifique. Ceci est un extrait de comment je le fais. Je suis sûr que vous comprenez le point et pouvez le résumer sur CanCan.

class ItemsController < ApplicationController 
    before_filter :login_required 
    # or if you only want to restrict it to some actions etc 
    # before_filter :login_required, :except => [:show] 
    # or 
    # before_filter :login_required, :only => [:edit] 
end 

class ApplicationController < ActionController::Base 
    protected 
    def login_required 
     access_denied! unless current_user.logged_in? 
    end 
end 

CanCan est pour l'autorisation et non l'authentification. Il y a une différence;)

+0

Très bien, merci beaucoup, je pense que je pensais sur le problème. Je peux toujours utiliser CanCan pour ma logique d'administration plus compliquée et ensuite utiliser quelque chose comme ce que vous avez écrit pour les pages que je me soucie de savoir si quelqu'un est connecté ou non. Merci beaucoup! – user258480

+0

Si cette réponse est assez pour vous, vous devez marquer votre question répondu en utilisant le lien vers la gauche de mon poste. –

0

Je ne sais pas si vous cherchez toujours la réponse à cette question, mais il est pas trop dur. Tout ce dont vous avez besoin est une condition qui est fausse pour un utilisateur invité. Dans votre bloc d'autre, mettre quelque chose comme peut: montrer, contrôleur FAISONS | contrôleur | user.id.present? fin

Si l'utilisateur est un invité, ce sera faux car il n'a pas été enregistré, et donc pas d'accès. Si c'est un utilisateur connecté, ce sera vrai, et donc ils vont avoir accès.

0

Peut-être que vous pouvez faire:

def initialize(user) 
    if user.role?("admin") 
     can :manage, :all 
    elsif user.role?("sales member") 
     can :manage, Request 
    elsif user.role?("sales admin") 
     can :manage, Request 
     can :manage, SpecialOffer 
    else 
     cannot :manage, :all 
    end 
    end 

Au lieu de mettre: tout, il suffit de mettre le nom du modèle (comme demande, SpecialOffer).

(How to implement the dynamic authorization with CanCan?)