Skip to content
eidottermihi edited this page Nov 16, 2012 · 5 revisions

Rechte definieren

Die einzelnen Rechte werden in app/models/ability.rb definiert.

Mit can wird kann ein Recht spezifiert werden. Beispiele:

can :destroy, CoffeeBox definiert das Recht zum Löschen einer Kaffeerunden (genauergesagt den Aufruf der Action destroy im CoffeeBox-Controller.

Ausführlich: https://github.com/ryanb/cancan/wiki/defining-abilities

can [:create, :update, :destroy], CoffeeBox definiert das Recht zum Erstellen, Bearbeiten und Löschen einer Kaffeerunde.

can :manage, :all definiert das Recht, alles auf allen Resourcen machen zu dürfen (z.B. für den globalen Administrator der Seite).

Bedingungen für Rechte

Das Recht zum Bearbeiten einer Kaffeerunden ist z.B. davon abhängig, ob der aktuelle User Administrator der Kaffeerunde ist. Formulierung in Cancan:

can [:edit, :update, :destroy], CoffeeBox, :user_id => user.id

:user_id verweist auf die Spalte user_id in der Tabelle coffee_boxes. Diese muss den gleichen Wert haben wie die ID des aktuell angemeldeten Benutzer (user.id), damit der User der Recht zum Bearbeiten der Kaffeerunde hat.

Überprüfung der Rechte

Die Prüfung kann im Controller oder in den Views geschehen. Dazu gibt es die Methode can?. Beispiele:

can? :update, @coffee_box prüft, ob der aktuell angemeldete Benutzer die aktuell verarbeitete Kaffeerunden bearbeiten darf.

Für den Controller gibt es den Helper load_and_authorize_resource, der für jede Action im Controller automatisch das Laden der Resource übernimmt und ebenfalls das entsprechende Recht überprüft:

class CoffeeBoxesController < ApplicationController
 load_and_authorize_resource
define new     
end

Durch den Helper sieht die tatsächliche new-Methode dann so aus:

define new
 @coffee_box = CoffeeBox.new
 authorize! :new, @coffee_box
end

Kommt bei der Prüfung heraus, dass der aktuelle User nicht das Recht hat, wird eine Exception geworfen.

Ausführlich:

https://github.com/ryanb/cancan/wiki/checking-abilities

https://github.com/ryanb/cancan/wiki/authorizing-controller-actions

Clone this wiki locally