L'autorisation est un élément essentiel de toute application web, car elle garantit que les utilisateurs ne peuvent accéder qu'aux ressources auxquelles ils sont autorisés. Pundit est une bibliothèque d'autorisation populaire pour Ruby on Rails qui permet aux développeurs de définir des règles d'accès fines. Cet article vous guidera dans l'utilisation de Pundit gem pour l'autorisation dans une application Web. Application Railsavec un exemple à l'appui.
Guide étape par étape
1. Ajouter Pundit à votre application Rails
Tout d'abord, ajoutez Pundit à votre Gemfile et lancez l'installation du bundle :
gemme 'pundit'
installation groupée
Ensuite, générez les fichiers d'installation de Pundit :
rails generate pundit:install
Cela créera un application_policy.rb dans le répertoire app/policies, qui sert de politique par défaut pour tous les modèles.
2. Définition des politiques
Dans Pundit, les politiques sont des objets Plain Old Ruby (PORO) qui encapsulent la logique d'autorisation. Chaque politique correspond à un modèle de votre application. Prenons un exemple simple : nous avons un modèle Post et nous voulons définir des règles d'autorisation pour ce modèle.
Créer une politique pour le modèle Post :
rails générer pundit:policy post
Cela génère un post_policy.rb dans le répertoire app/policies.
3. Mise en œuvre de la logique d'autorisation
Ouvrez le fichier post_policy.rb et définissez les règles d'autorisation :
classe PostPolicy < ApplicationPolicy
def index ?
vrai
end
def show ?
true
end
def create ?
user.present ?
end
def update ?
user.present ? && user == record.user
end
def destroy ?
user.present ? && user == record.user
end
end
Nous définissons ici les méthodes correspondant à chaque action (indexer ?, afficher ?, créer ?, mettre à jour ? et détruire ?). Ces méthodes renvoient un message vrai ou faux en fonction de l'utilisateur et de l'enregistrement auquel on accède.
4. Utilisation de stratégies dans les contrôleurs
Dans vos contrôleurs, vous pouvez utiliser Pundit pour autoriser des actions. Tout d'abord, incluez le module Pundit dans l'ApplicationController :
classe ApplicationController < ActionController::Base
y compris Pundit
fin
Ensuite, utilisez la méthode authorize pour vérifier l'autorisation dans votre PostsController :
classe PostsController < ApplicationController
before_action :authenticate_user !
before_action :set_post, only : [:show, :edit, :update, :destroy]
def index
@posts = Post.all
autoriser @posts
end
def show
end
def new
@post = Post.new
autoriser @post
end
def create
@post = current_user.posts.build(post_params)
autoriser @post
si @post.save
redirect_to @post, notice : 'Le message a été créé avec succès.'
else
render :new
end
end
def edit
autoriser @post
end
def update
autoriser @post
si @post.update(post_params)
redirect_to @post, notice : 'Le message a été mis à jour avec succès.'
else
render :edit
end
end
def destroy
autoriser @post
@post.destroy
redirect_to posts_url, notice : 'Le message a été détruit avec succès.'
end
privé
def set_post
@post = Post.find(params[:id])
end
def post_params
params.require(:post).permit(:title, :body)
end
end
Dans ce contrôleur, nous utilisons authorize pour vérifier les permissions avant d'effectuer des actions.
5. Traitement des accès non autorisés
Pundit lève une erreur Pundit::NotAuthorizedError si un utilisateur n'est pas autorisé à effectuer une action. Vous pouvez gérer cette erreur globalement dans l'ApplicationController :
class ApplicationController < ActionController::Base
include Pundit
rescue_from Pundit::NotAuthorizedError, with : :user_not_authorized
private
def user_not_authorized
flash[:alert] = "Vous n'êtes pas autorisé à effectuer cette action."
redirect_to(request.referrer || root_path)
end
fin
Ainsi, si un utilisateur tente d'effectuer une action non autorisée, il sera redirigé vers un message d'erreur.
Conclusion
L'utilisation de Pundit pour l'autorisation dans Rails est un moyen puissant et flexible de contrôler l'accès aux ressources dans votre application. En définissant des politiques et en les utilisant dans vos contrôleurs, vous pouvez vous assurer que les utilisateurs ne peuvent effectuer que les actions pour lesquelles ils sont autorisés. Nous avons couvert les bases, mais Pundit prend également en charge des scénarios plus complexes, y compris les champs d'application et les générateurs de politiques personnalisés.
Pour plus d'informations, consultez le site Dépôt GitHub Pundit