Wie kann Devise / CanCan zum Schutz eingehängter Engine-Ressourcen verwendet werden?

8

Ich habe eine Engine auf meiner Haupt-App installiert und möchte bestimmte Controller und Aktionen innerhalb dieser Engine schützen.

Der Motor ist montiert mit:

%Vor%

Devise / CanCan arbeitet mit den übrigen Controllern und Aktionen der Haupt-App zusammen, aber die Ausführung von Dingen ohne etwas anderes erzeugt diesen Fehler:

%Vor%

Also öffne ich die Motorsteuerungen von der Haupt-App aus mit dem Decorator-Ansatz und füge hinzu:

%Vor%

Dann bekomme ich diesen Fehler:

%Vor%

Ich kann die Dinge mit den folgenden Aufgaben erledigen, aber es ist klobig, wenn ich versuche, Rollen zu implementieren:

%Vor%

Mit clunky meine ich, ich muss den obigen Codeblock in der Datei routes.rb für jede Rolle reproduzieren, die Zugriff auf die Engine hat ... es sei denn, es gibt eine andere Möglichkeit, authenticate mit Rollen zu verwenden, die ich nicht habe wissen über ???

Ich möchte, wenn möglich, den normalen Autorisierungs- / Authentifizierungsansatz von Devise / CanCan im Controller verwenden. Aber ich denke, dass "no route match" -Fehler auftritt, weil die Engine nicht weiß, wie man zu den Devise-Controllern der Haupt-App kommt. Aber wie komme ich damit aus der Haupt-App heraus?

Um ein weiteres Problem in den Mix zu werfen ... gibt es einen bestimmten Controller / eine bestimmte Aktion in der Engine, die ich allen Benutzern mitteilen möchte. Bisher habe ich dies gerade vor dem Authentifizierungsblock in der Datei routes.rb hinzugefügt.

%Vor%

Es funktioniert ... aber diese Zeile mit dem Block in der routes.rb scheint, als würde ich etwas falsch machen. Und es erlaubt mir nicht, Rollen gut zu implementieren.

    
A L 31.08.2012, 03:19
quelle

1 Antwort

8

Sie können den Anwendungs-Controller zur Verwendung übernehmen und von der Haupt-App aus cancan.

%Vor%

Danach können Sie Fähigkeiten für die Engine erstellen, indem Sie eigene erstellen.

%Vor%

SomeModel ( SomeEngine::SomeModel ) ist ein Modell bei SomeEngine engine.

Bei Ressourcencontrollern müssen Sie den Klassennamen der Ressource angeben.

load_and_authorize_resource class: SomeEngine::SomeModel

Und vergessen Sie nicht, den Routenhelfer im Hauptanwendungslayout zu main_app.MAIN_APP_PATHS zu ändern, wenn Sie ihn in der Engine verwenden möchten.

    
Yuriy Kolodovskyy 01.09.2012, 09:29
quelle