2010-04-29 6 views
2

Je suis actuellement en train de créer une application Rails et d'essayer de déterminer la meilleure façon d'authentifier qu'un utilisateur possède l'objet de données qu'il essaie de modifier. J'ai déjà un système d'authentification en place (reposful-authentication), et j'utilise un simple before_filter pour m'assurer qu'un utilisateur est connecté avant de pouvoir accéder à certaines zones du site. Cependant, je ne suis pas sûr de la meilleure façon de gérer un utilisateur essayant de modifier une donnée spécifique - par exemple, disons que les utilisateurs de mon site peuvent posséder des Livres, et qu'ils peuvent modifier les propriétés du livre (titre , auteur, pages, etc), mais ils devraient seulement être en mesure de le faire pour les livres qui leur appartiennent.Autorisation de l'utilisateur Rails

Dans ma méthode 'edit' sur le contrôleur de livres, j'aurais une recherche qui ne récupèrerait que les livres appartenant à current_user. Cependant, si un autre utilisateur connaissait l'identifiant du livre, il pouvait taper http://website.com/book/7/edit, et le contrôleur vérifierait qu'il était connecté, puis afficherait la page d'édition de ce livre (semble contourner le contrôleur).

Quelle est la meilleure façon de gérer cela? Est-ce plus un problème de routage de convention Rails que je ne comprends pas (pouvoir accéder directement à la page d'édition), ou devrais-je ajouter des callbacks before_find, before_save, before_update, after_find etc. à mon modèle?

Répondre

2

vérifier les gemmes suivantes:

  • cancan
  • concevoir
  • authlogic

et ne manquez pas Ryan grande railscasts sur le

ci-dessus
+0

Je n'avais pas réalisé que c'était quelque chose qui nécessiterait un plugin - merci pour les conseils. Je crois que je vais aller avec le plugin Cancan. –

+0

Je vous conseillerais de choisir authlogic. :) –

+0

Vous pouvez également considérer ma gemme, Autorité: https://github.com/nathanl/authority –

2

cela donnera accès à toute personne qui change la valeur dans la barre d'adresse

@book = Book.find(params[:id]) 

mais si vous passez par l'association de l'utilisateur connecté sur des rails utilisateur (ActiveRecord) mettra automatiquement à jour la requête SQL

@book = current_user.books.find(params[:id]) 

Bien sûr, cela suppose que votre table de livres a une colonne user_id

2

Vous pouvez avoir besoin d'un plug-in d'autorisation. J'ai eu une certaine expérience d'utilisation this plugin un certain temps. This article a également un aperçu:

0

Hey, je l'ai fait récemment moi-même. La meilleure façon de le faire est d'avoir l'affichage de la fonction d'édition sur la page, mais dans un encas procédé tel que:

<%if current_user %> 
    <% if current_user.id == wishlist.user_id %> 
    <div id="text3"><%= link_to 'Edit', edit_wishlist_path(@wishlist) %></div><br /> 
    <%end%> 
    <%end%> 

Est-ce que vous espériez?

+0

Man, c'est une vieille question - Je suis venu un si long chemin depuis lors. Pour tous mes projets, j'utilise authlogic pour m'authentifier et cancan pour autoriser.Faites une recherche google rapide pour l'un de ces - ce sont des bibliothèques fantastiques et vous faciliteront la vie. –