Die Autorisierung ist eine wichtige Komponente jeder Webanwendung, die sicherstellt, dass Benutzer nur auf die Ressourcen zugreifen können, für die sie berechtigt sind. Pundit ist eine beliebte Autorisierungsbibliothek für Ruby on Rails, die es Entwicklern ermöglicht, feinkörnige Zugriffsregeln zu definieren. Dieser Artikel führt Sie durch die Verwendung des Pundit-Gems für die Autorisierung in einer Rails-Anwendung, mit einem Beispiel.
Schritt-für-Schritt-Anleitung
1. Hinzufügen von Pundit zu Ihrer Rails-Anwendung
Fügen Sie zunächst Pundit zu Ihrem Gemfile hinzu und führen Sie bundle install aus:
Edelstein 'pundit'
Bundle-Installation
Als nächstes erzeugen Sie die Pundit-Installationsdateien:
Schienen erzeugen pundit:install
Dadurch wird eine application_policy.rb Datei im Verzeichnis app/policies, die als Standardrichtlinie für alle Modelle dient.
2. Festlegen von Politiken
Policies in Pundit sind Plain Old Ruby Objects (POROs), die die Autorisierungslogik kapseln. Jede Richtlinie entspricht einem Modell in Ihrer Anwendung. Betrachten wir ein einfaches Beispiel, bei dem wir ein Post-Modell haben und dafür Autorisierungsregeln definieren wollen.
Erstellen Sie eine Richtlinie für das Modell Post:
Schienen erzeugen pundit:policy post
Dies erzeugt eine post_policy.rb Datei im Verzeichnis app/policies.
3. Implementierung der Autorisierungslogik
Öffnen Sie die Datei post_policy.rb und definieren Sie die Autorisierungsregeln:
class PostPolicy < ApplicationPolicy
def index?
true
end
def show?
true
end
def create?
user.present?
end
def aktualisieren?
user.present? && user == record.user
end
def destroy?
user.present? && user == record.user
end
end
Hier werden für jede Aktion (index?, show?, create?, update? und destroy?) entsprechende Methoden definiert. Diese Methoden geben je nach Benutzer und Datensatz, auf den zugegriffen wird, true oder false zurück.
4. Verwendung von Richtlinien in Controllern
In Ihren Controllern können Sie Pundit verwenden, um Aktionen zu autorisieren. Fügen Sie zunächst das Pundit-Modul in den ApplicationController ein:
Klasse ApplicationController < ActionController::Base
umfassen Pundit
Ende
Verwenden Sie dann die authorize-Methode, um die Autorisierung in Ihrem PostsController zu überprüfen:
Klasse PostsController < AnwendungsController
before_action :authenticate_user!
before_action :set_post, only: [:show, :edit, :update, :destroy]
def index
@posts = Post.all
authorize @posts
end
def zeigen
end
def neu
@post = Post.new
autorisieren @post
end
def erstellen
@post = current_user.posts.build(post_params)
authorize @post
if @post.save
redirect_to @post, notice: 'Beitrag wurde erfolgreich erstellt.'
else
render :new
end
end
def bearbeiten
autorisieren @post
end
def aktualisieren
authorize @post
if @post.update(post_params)
redirect_to @post, notice: 'Beitrag wurde erfolgreich aktualisiert.'
else
render :edit
end
end
def zerstören
autorisiere @post
@post.destroy
redirect_to posts_url, notice: 'Beitrag wurde erfolgreich zerstört.'
end
privat
def set_post
@post = Post.find(params[:id])
end
def post_params
params.require(:post).permit(:title, :body)
end
end
In diesem Controller verwenden wir authorize, um die Berechtigungen zu prüfen, bevor wir eine Aktion durchführen.
5. Umgang mit unberechtigtem Zugriff
Pundit löst einen Pundit::NotAuthorizedError aus, wenn ein Benutzer nicht berechtigt ist, eine Aktion durchzuführen. Sie können diesen Fehler global im ApplicationController behandeln:
Klasse ApplicationController < ActionController::Base
include Pundit
rescue_from Pundit::NotAuthorizedError, mit: :user_not_authorized
private
def benutzer_nicht_autorisiert
flash[:alert] = "Sie sind nicht berechtigt, diese Aktion durchzuführen."
redirect_to(request.referrer || root_path)
end
end
Wenn ein Benutzer versucht, eine nicht autorisierte Aktion durchzuführen, wird er mit einer Fehlermeldung weitergeleitet.
Abschluss
Die Verwendung von Pundit für die Autorisierung in Rails ist eine leistungsstarke und flexible Möglichkeit, den Zugriff auf Ressourcen in Ihrer Anwendung zu kontrollieren. Durch die Definition von Richtlinien und deren Verwendung in Ihren Controllern können Sie sicherstellen, dass Benutzer nur Aktionen ausführen können, für die sie berechtigt sind. Hier wurden die Grundlagen behandelt, aber Pundit unterstützt auch komplexere Szenarien, einschließlich Scopes und benutzerdefinierte Richtliniengeneratoren.
Ausführlichere Informationen finden Sie in der Pundit GitHub-Repository