-
Notifications
You must be signed in to change notification settings - Fork 1
Cancan
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).
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.
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