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?
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
@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) –