Je l'ai donc pour que la vue de spectacle sur la page du client lie à toutes les commandes qu'ils ont placées. Quand ils cliquent sur "Afficher", il les prend à la vue Afficher pour cet ordre. Cependant, s'ils devaient changer l'identifiant de l'ordre dans l'URL, ils peuvent ensuite voir les ordres des autres. S'il vous plaît, une personne peut-elle aider ou suggérer des moyens dans lesquels je peux l'avoir afin que si quelqu'un essaie d'afficher une commande autre que celui qui a été dirigé, ils seront redirigés vers leur page client? Je peux obtenir le bit de redirection fonctionnant bien, en utilisant:
redirect_to customers_path(session[:customer_id])
7 Réponses :
Une bonne solution serait de supprimer l'itinéraire correspondant et de la vue en premier lieu. Au lieu de cela, faites une sorte de page pour un utilisateur de voir ses propres commandes.
Je ne suis pas sûr de la gemme d'authentification de l'utilisateur que vous utilisez, mais si vous utilisez Concevez, vous pouvez écrire du code comme celui-ci: P>
<% if current_user.eql?(@user) %> <%= # show order history %> <% end %>
En supposant que votre modèle de commande a un concept de "qui possède cette commande", via une colonne entière appelée quelque chose comme Vous garderez généralement ce code d'autorisation dans vos contrôleurs. P> user_id code>, vous pouvez vérifier si session [: client_ide] code> est égal à ordre.user_id code> (ou tout ce que vous l'appelez). class OrdersController
...
def show
@order = Order.find params[:id]
unless session[:customer_id] == @order.user_id
flash[:notice] = "You don't have access to that order!"
redirect_to customers_path(session[:customer_id])
return
end
end
...
end
Je recommande de commencer par Cancan. Il est plus facile de l'ajouter tôt et d'attraper des endroits où vous pourriez oublier un contrôle d'autorisation si vous souhaitez utiliser l'habitude d'utiliser load_and_authorize_resource code>.
J'essaie effectivement d'ajouter des fonctionnalités à une application existante pour apprendre à faire des choses moi-même - malheureusement trop tard pour la construction avec des gemmes à l'esprit, mais je vais examiner à l'aide de Cancan la prochaine fois, merci.
Je recommande d'ajouter un gemme d'autorisation telle que CANCAN, ce qui vous permet de déterminer si l'utilisateur a accès à certaines choses (par exemple modifier une commande, afficher une commande, etc.). Cela peut être utile de beaucoup de manières; Vous voudrez peut-être avoir des pages d'administration (pour ajouter de nouveaux produits, dire) que les clients ne devraient jamais avoir accès à.
Une fois que vous l'avez mis en place, vous pouvez limiter l'accès d'un client afin qu'ils ne puissent que voir ou modifier leurs propres commandes. . À Cancan, vous créez une classe appelée capacités.rb qui ressemble à quelque chose comme: p> ce bit sur peut [: lire,: mise à jour], commander ,: user_id => user.id code> signifie "L'utilisateur (non admin) peut lire ou mettre à jour une commande si la commande.user_id == user.id" (Ie l'ID de l'utilisateur actuel). P> P >
Comme vous pouvez le voir ici Github.com/ryanb/cancan/issues/1042 Cancan est ne se développer plus activement. Utilisez github.com/cancancommunity/cancancan à la place
Vous pouvez également vérifier le plugin d'autorisation. Il est préférable de concevoir cela afin que vous puissiez utiliser également pour d'autres fonctionnalités. Ne comptez pas sur les paramètres côté client pour trouver l'identité d'un utilisateur. Plus d'informations Ici: http://www.rubyInside.com/authorization -Perrissions-plugin-for-rails-154.html P>
Légère mod de la solution de @ BinaryMuse à l'aide de Current_User Helper de Devise, l'opérateur de comparaison conditionnel "si" et différent (! =).
def show
@order = Order.find params[:id]
if current_user.id != @order.user_id
flash[:notice] = "MEAN MESSAGE HERE!"
redirect_to orders_path(session[:current_user])
return
end
end
(current_user.id == params[:id].to_i || is_writer?) || user_denied In my case is_writer? check if the user can modify the order instead user_denied is a method with redirect and alert
Fondamentalement, vous devez créer des rails admin-- ou admin aux utilisateurs et ajoutez des validations à la mise en place des rôles d'administration sur ces validations - lors de l'ajout de l'administrateur SE FAUX sur défaut p> p>