2010-10-22 5 views
7

J'ai une ressource Projets qui est imbriquée dans la ressource Utilisateurs.Rails cancan autorisant les ressources imbriquées

classe Mon Cancan Ability est:

class Ability 
    include CanCan::Ability 
    def initialize(user) 
    #everyone 
    can :read, Project 

    if user.blank? 
     # guest user 
     ... 
    else 
     #every signed in user 

     case user.role 
     when User::ROLES[:admin] 
      #only admin role user 
      can :manage, :all 

     when User::ROLES[:member] 
      #only member role user 
      can :update, User, :id => user.id 
      can [:create, :update, :destroy], Project, :user_id => user.id 
     else 

     end 
    end 
    end 
end 

Et contrôleur Projets:

class ProjectsController < ApplicationController 
    load_and_authorize_resource :user 
    load_and_authorize_resource :projects, :through => :user, :shallow => true 
    ... 
end 

J'ai quelques questions:

Est-il possible de refuser: lire utilisateur et laisser: lire Projet, pour que tout le monde puisse accéder à/users/10/projects, mais pas/users/10 ou/users?

Comment puis-je refuser l'accès à l'utilisateur: nouvelle action avec un autre id_utilisateur? Par exemple, si j'ajoute

#everyone 
can :read, User 
can :read, Project 

ce code permet à l'utilisateur avec l'ID 42 d'accéder à/user/41/projects/new.

Répondre

10

a résolu le problème en faisant:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    #everyone 
    can :read, Project 

    can :read, User # required to access nested resources 
    cannot :index, User 
    cannot :show, User 

    if user.blank? 
     # guest user 
     ... 
    else 
     #every signed in user 

     case user.role 
     when User::ROLES[:admin] 
      #only admin role user 
      can :manage, :all 

     when User::ROLES[:member] 
      #only member role user 
      can :update, User, :id => user.id 
      can :manage, Project, :user => { :id => user.id } 
     else 

     end 
    end 
    end 
end 
Questions connexes