Forum: Italian Ruby user group cancan e abilities per controller actions di una gem.

Posted by Msan Msan (msan)
on 2012-09-25 10:22
(Received via mailing list)
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.
Posted by Paolo Montrasio (pmontrasio)
on 2012-09-25 13:53
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 Msan 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.
Posted by Msan Msan (msan)
on 2012-09-25 15:32
(Received via mailing list)
2012/9/25 Paolo Montrasio <paolo@paolomontrasio.com>:
>     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?
Posted by Paolo Montrasio (pmontrasio)
on 2012-09-25 17:39
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 Msan wrote in post #1077464:
> 2012/9/25 Paolo Montrasio <paolo@paolomontrasio.com>:
>>     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?
Posted by Msan Msan (msan)
on 2012-09-25 18:22
(Received via mailing list)
2012/9/25 Paolo Montrasio <paolo@paolomontrasio.com>:
> 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?
Posted by Paolo Montrasio (pmontrasio)
on 2012-09-25 19:40
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.

https://github.com/ryanb/cancan/issues/138

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

Paolo

Msan Msan wrote in post #1077494:
> 2012/9/25 Paolo Montrasio <paolo@paolomontrasio.com>:
>> 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?
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.