Cancan e abilities per controller actions di una gem

Salve.
Non vorrei sbagliare ma le abilities di cancan controllano solo le 7
canoniche actions? Cioe’ new, show, create, ecc.?
Se volessi usarle per delle actions definite nei controllers di una
gem e se in questi controller ci fossero delle custom actions come si
puo’ fare?
Non posso di certo andare a spulciare ogni controller per capire quali
action vengono utilizzate per poterle inserire nelle abilities.

Non posso dirmi un grande esperto di CanCan ma visto che non ha ancora
risposto nessuno ecco cosa ho trovato in un progetto a cui sto
lavorando, impostato da altri prima di me.

app/models/ability

class Ability
include CanCan::Ability

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

can :change_language, User

end
end

app/controllers/users_controller.rb

class UsersController < ApplicationController

before_filter :require_user, :only => […, :change_language]
load_and_authorize_resource

def change_language
# codice che cambia la lingua dell’utente @user
# è chiamato con GET cliccando la bandierina nel menu lingue
end

end

Quindi mi viene da dire che non serve nulla di particolare, basta
chiamare il metodo can dentro l’initialize di Ability dandogli come
argomento nome del metodo del controller e classe.

Paolo

Msan M. wrote in post #1077418:

Salve.
Non vorrei sbagliare ma le abilities di cancan controllano solo le 7
canoniche actions? Cioe’ new, show, create, ecc.?
Se volessi usarle per delle actions definite nei controllers di una
gem e se in questi controller ci fossero delle custom actions come si
puo’ fare?
Non posso di certo andare a spulciare ogni controller per capire quali
action vengono utilizzate per poterle inserire nelle abilities.

2012/9/25 Paolo M. [email protected]:

user ||= User.new

before_filter :require_user, :only => […, :change_language]
chiamare il metodo can dentro l’initialize di Ability dandogli come
argomento nome del metodo del controller e classe.

Appunto quindi devo spulciare i controller utilizzati nella gem e
indicare nelle abilities i metodi per i quali deve intervenire cancan?

2012/9/25 Paolo M. [email protected]:

S, soprattutto se blocchi tutto per default (che quello che
consiglio) con

class ApplicationController < ActionController::Base
check_authorization
end

Te lo consiglio sia come misura di sicurezza sia per accorgerti se stai
lasciando indietro qualcosa.

Infatti e’ quello che ho fatto.
Ovviamente e’ sconsigliabile andare a modificare il codice di una gem
per poter inserire in ogni controller load_and_authorize_resource.
Come potrei fare allora?

Sì, soprattutto se blocchi tutto per default (che è quello che
consiglio) con

class ApplicationController < ActionController::Base
check_authorization
end

Te lo consiglio sia come misura di sicurezza sia per accorgerti se stai
lasciando indietro qualcosa.

Paolo

Msan M. wrote in post #1077464:

2012/9/25 Paolo M. [email protected]:

user ||= User.new

before_filter :require_user, :only => […, :change_language]
chiamare il metodo can dentro l’initialize di Ability dandogli come
argomento nome del metodo del controller e classe.

Appunto quindi devo spulciare i controller utilizzati nella gem e
indicare nelle abilities i metodi per i quali deve intervenire cancan?

Nel progetto su cui sto lavorando non tutti i controller hanno bisogno
del load_and_authorize_resource. Alcuni hanno solo l’authorize_resource
altri non hanno nulla.

Ho googlato uno che l’aveva messo in ApplicationController ma aveva
avuto un problema con devise (2 anni fa) e gli hanno anche risposto che
non è l’approccio consigliato.

Mi sa che dovrai metterli a mano o farti uno script in Ruby per
aggiungere la riga :slight_smile:

Paolo

Msan M. wrote in post #1077494:

2012/9/25 Paolo M. [email protected]:

S, soprattutto se blocchi tutto per default (che quello che
consiglio) con

class ApplicationController < ActionController::Base
check_authorization
end

Te lo consiglio sia come misura di sicurezza sia per accorgerti se stai
lasciando indietro qualcosa.

Infatti e’ quello che ho fatto.
Ovviamente e’ sconsigliabile andare a modificare il codice di una gem
per poter inserire in ogni controller load_and_authorize_resource.
Come potrei fare allora?