#20 Restricting Access
Restreindre les accès
Dans l'épisode précédent nous avons créé des liens pour créer, modifier et supprimer des épisodes d'ASCIIcasts. Les liens fonctionnent mais un peu trop puisque tout le monde peut cliquer dessus.
La liste des épisodes avec les liens d'administration visibles à tous les utilisateurs.
Ce dont on a besoin est de restreindre les liens uniquement à ceux qui ont la permission de modifier les épisodes. Nous allons modifier notre vue partielle précédente pour qu'elle ne rende que les liens edit
et destroy
si une méthode appelée admin?
retourne true. (Nous ferons lq même chose pour le lien new
mais nous ne montreront pas le code ici).
<li> <p class="episodeId"><%= episode.episode_id %></p> <h3><%= link_to episode.title, episode_path(episode.identifier) %></h3> <p class="summary"><%= episode.summary %></p> <p class="tagList"> Tags: <% episode.tags.each do |tag| %><%= link_to tag.title, tag_path(tag.title) %><% end %> </p> <% if admin? %> <p class="adminActions"> <%= link_to "Edit", edit_episode_path(episode) %> <%= link_to "Destroy", episode_path(episode), :confirm => "Are you sure?", :method => :delete %> </p> <% end %> </li>
La vue partielle episode
avec l'appel à admin?
encapsulant les liens edit
et destroy
.
Ensuite, nous avons besoin d'écrire la méthode admin?
, mais où devrait-elle aller ? Puisque nous allons appeler cette méthode depuis une vue, la place la plus évidente est dans un fichier de helper de l'application mais nous voudrions aussi qu'elle soit disponible dans les contrôleurs, donc on vq plutôt l'ajouter dans le contrôleur de l'application.
class ApplicationController < ActionController::Base helper_method :admin? protected def admin? false end end
La méthode admin?
ajoutée à ApplicationController
.
Pour l'instant, notre méthode admin?
va juste retourner false
, (on l'implémentera complètement dans le prochain épisode). Comme nous voulons l'utiliser dans nos vues, nous devons utiliser la méthode helper_method
qui la rend accessible depuis le code des vues.
On y est presque
Maintenant que nous avons écris notre méthode admin?
, nos liens sont cachés au utilisateurs non-administrateurs. Pourtant, il y a toujours un léger problème : N'importe qui peut toujours visiter la page d'administration directement et ajouter ou modifier des épisodes par ce moyen. On peut corriger ça en utilisant before_filter
.
class EpisodesController < ApplicationController before_filter :authorize, :except => [:index, :show ] def index @episodes = Episode.find(:all) end # show, new, create, edit, update and destroy methods hidden. end
The episodes controller (with the method bodies removed).
L'appel à before_filter
va exécuter une méthode appelée authorize
avant l'appel de n'importe quelle méthode de notre contrôleur sauf pour les méthodes index
et show
. Maintenant, nous allons avoir besoin d'écrire la méthode authorize
. Nous allons la mettre dans le contrôleur Application pour qu'elle soit accessible depuis n'importe quel contrôleur.
class ApplicationController < ActionController::Base helper_method :admin? protected def admin? false end def authorize unless admin? flash[:error] = “Unauthorized access” redirect_to home_path false end end end
ApplicationController
avec la méthode authorize
ajoutée.
La méthode vérifie que l'utilisateur est un administrateur. Si ce n'est pas le cas, nous affichons un message temporaire et le redirigeons vers la page d'accueil. Enfin, elle retourne false
ainsi aucune action n'est exécutée. Maintenant, si nous essayons la nouvelle page de l'épisode, nous sommes redirigés vers la page d'accueil. Alternativement, si nous ne voulons pas que les utilisateurs non autorisés connaissent l'existence de la page, nous pouvons lancer une erreur 404 à la place (Page Not Found).
#TODO:
Notre système d'administration est presque bon mais nous avons toujours besoin d'implémenter la méthode admin?
. Nous allons vous montrer comment dans le prochain épisode.