2012-04-11 14 views
1

Meine Berechtigungen sind in einer Datenbank wie beschrieben auf CanCan wiki definiert. Ich möchte die :index nur für die ID in meiner Berechtigungstabelle autorisieren, aber immer noch die Indexseite anzeigen, wenn keine Ressource autorisiert wurde.CanCan Fähigkeiten über Datenbank und load_resource

Wenn ich load_and_authorize_resource verwende, lädt es die Ressourcen basierend auf den Berechtigungen. Wenn ich keine habe, ist die index Aktion nicht zugänglich. Ich bekomme einen Zugriff auf die Ressource verweigert.

Wenn ich noch ohne Ressource Zugriff auf die :index Aktion zulassen möchten autorisiert, sehe ich zwei Möglichkeiten:

Option 1 (hate it) : Laden Sie manuell die Ressourcen für den Index.

class FirmsController < ApplicationController 
    load_and_authorize_resource :except => :index 

    def index 
    @firms = user.permissions.where{action: ["index", "manage", "read"], subject_class: "Firm"} 
    end 
end 

Option 2 (meh): Fügen Sie eine Möglichkeit für den: Index mit einer Einschränkung von id: [] (nichts) und überschreibt es mit meinen Datenbankberechtigungen danach.

class Ability 
    include CanCan::Ability 

    def initialize(user) 

    user ||= User.new # guest user (not logged in) 

    can :create, Firm 
    can :index, Firm, id: [] 

    user.permissions.each do |permission| 
     if permission.subject_id.nil? 
     can permission.action.to_sym, permission.subject_class.constantize 
     else 
     can permission.action.to_sym, permission.subject_class.constantize, :id => permission.subject_id 
     end 
    end 

    end 
end 

Option 3?

Können Sie sich eine sauberere Lösung vorstellen?

Antwort

1

Wie in docs angegeben Sie Hilfsmethode verwenden sollten:

skip_authorize_resource :only => :index 
+0

Hallo Markus, testete ich es und es funktioniert wie erwartet (danke!). Obwohl ich ein bisschen verwirrt bin über das, was es tatsächlich macht. Ich musste auch einen 'skip_authorization_check: only =>: index' hinzufügen. Bedeutet dies, dass meine Ressource überhaupt nicht autorisiert ist? Wie kommt es, dass der Index dann nicht alle Ressourcen anzeigt (auch die, für die ich nicht autorisiert bin)? Ist der load_resource-Teil intelligent genug, um nichts zu laden? – karellm

+0

@kalema, lädt 'load_and_authorize_resource' einfach Regress (oder Sammlung) und dann Autorisierung. Wenn Sie die Autorisierung direkt überspringen, wird nur das Laden ausgeführt. Siehe [Dokumente] (https://github.com/ryanb/cancan/blob/master/lib/cancan/controller_additions.rb) –