2017-11-06 2 views
2

Setup:Rails CanCanCan/Rolemodel/Canard: Begrenzung Benutzer nicht funktioniert

  • Rails 5.1, Rubin 2.4.0
  • User.rb aus Devise erstellt Erweitert mit CanCanCan und Canard (einschließlich Rolemodel)
  • Sammlung has_many Artikel (МРnicht)
  • Wunschliste has_many WishlistItems (die Arbeit)

KOMMT user.rb:

acts_as_user :roles => [ :guest, :user, :entity_admin, :admin, :super_admin ] 

Diejenigen in einem roles_mask Feld in der Benutzertabelle gespeichert sind (Werte abbilden auf 1, 2, 4, 8, 16).

Auf der Admin und super_admin Ebenen, die Dinge gut funktionieren, aber es ist so weit offen definiert, so ist das zu erwarten:

manage[:all] 

Auf der Benutzerebene, ist es auf Elemente beschränkt, die der Benutzer besitzt:

# app/abilities/users.rb 
Canard::Abilities.for(:user) do 
    can [:read], :all 

    can [:manage], Collection do |collection| 
    collection.try(:user) == @user 
    end 

    can [:manage], Item, :collection => { user_id: user.id } 

    can [:manage], Wishlist do |wishlist| 
    wishlist.try(:user) == @user 
    end 

    can [:manage], WishlistItem do |wi| 
    wi.try(:user) == @user 
    end 
end 

ich habe auch versucht die einfachere Erklärung:

can [:manage], Collection, user_id: @user.id 

ohne Erfolg.

In den Steuerungen werden die Dinge geladen und entsprechend zugelassen:

# app/controllers/collections_controller.rb:6 
load_and_authorize_resource :collection, except: [:index, :show, :create] 

# app/controllers/items_controller.rb:6-7 
load_and_authorize_resource :collection 
load_and_authorize_resource :item, through: :collection 

#app/controllers/collections_controller Finder method from before_action 
private 
def set_collection 
    @collection = @user.collections.friendly.find(params[:id]).decorate 
end 

Also habe ich eine Sammlung erstellen können, und in der Konsole gehört es zu den richtigen Benutzer. Ich erhalte jedoch einen CanCan-Fehler, wenn ich versuche, Änderungen daran vorzunehmen ("Sie sind nicht berechtigt, auf diese Seite zuzugreifen."). Das Hinzufügen eines Elements schlägt automatisch fehl.

Ich bin sicher, das ist ein Benutzerfehler meinerseits, aber ich kann es nicht für das Leben von mir herausfinden.

+0

so ... was ist dein Fehler/Problem? – MrYoshiji

+0

fett den Fehler –

Antwort

2

Es scheint, dass das mit CanCanCan autorisierte Objekt dekoriert wurde. Sie können mit dem folgenden can? und authorize! in ability.rb überlasten:

def can?(action, subject, *extra_args) 
    subject_arg = subject.is_a?(Draper::Decorator) ? subject.model : subject 
    super(action, subject_arg, *extra_args) 
end 

def authorize!(action, subject, *extra_args) 
    subject_arg = subject.is_a?(Draper::Decorator) ? subject.model : subject 
    super(action, subject_arg, *extra_args) 
end 

Diese alle Vorkommen behandelt ein dekoriertes Objekt in eine Fähigkeit Scheck übergeben.