7

顧客のページの表示ビューが、顧客が行ったすべての注文にリンクするようにしました。「表示」をクリックすると、その注文の表示ビューに移動します。ただし、URL の注文の ID を変更すると、他の人の注文を見ることができます。誰かが指示されたものとは異なる注文を表示しようとした場合に、顧客ページにリダイレクトされるようにする方法を誰かが助けたり提案したりできますか? 次を使用して、リダイレクト ビットを正常に動作させることができます。

redirect_to customers_path(session[:customer_id])

しかし、顧客がその注文のみを表示できるようにアプリケーションを取得するにはどうすればよいでしょうか? 注文IDがURLの注文IDと等しいことを確認するようなロジックを使用できないようです。これは常に真実であることが証明されます!

4

7 に答える 7

14

Order モデルに「誰がこの注文を所有するか」という概念があると仮定すると、通常は のような整数列を介して、が(またはあなたがそれを何と呼んでも) に等しいuser_idかどうかを確認できます。session[:customer_id]order.user_id

通常、この認証コードはコントローラーに保持します。

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

アプリケーションがより複雑になるにつれて、このロジックを処理するためにCanCanのような認可 gem を調べるかもしれません。

于 2012-06-18T20:48:47.493 に答える
10

CanCanなどの認証gemを追加することをお勧めします。これにより、ユーザーが特定の操作(注文の編集、注文の表示など)を実行できるかどうかを設定できます。これは多くの点で便利です。顧客が決してアクセスできないようにするための管理ページ(たとえば、新製品を追加するため)が必要になる場合があります。

それが整ったら、顧客のアクセスを制限して、顧客が自分の注文のみを表示または編集できるようにすることができます。CanCanで、次のようなabilities.rbというクラスを作成します。

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.admin?
      can :manage, :all
    else
      can [:read, :update], Order, :user_id => user.id
    end
  end
end

そのビットcan [:read, :update], Order, :user_id => user.idは、「(非管理者の)ユーザーは、order.user_id == user.id(つまり、現在のユーザーのID)の場合、注文を読み取ったり更新したりできる」ことを意味します。

于 2012-06-18T20:52:12.057 に答える
1

適切な解決策は、対応するルートとビューを最初に削除することです。代わりに、ユーザーが自分の注文を確認できるように、ある種のページを作成します。

どのユーザー認証 gem を使用しているかはわかりませんが、Devise を使用している場合は、次のようなコードを記述できます。

<% current_user.orders.each do |order| %>
  <%= render order %>
<% end %>

現在のビューとルート階層を維持したい場合は、ユーザーのページでこのコードを使用できます。

<% if current_user.eql?(@user) %>
  <%= # show order history %>
<% end %>

Devise を使用していないのであれば、 current_user ヘルパー メソッドを記述して同じ機能を実現するのはそれほど難しくないと思います。

于 2012-06-18T20:48:38.627 に答える
0
(current_user.id == params[:id].to_i || is_writer?) || user_denied

私の場合はis_writer? ユーザーが代わりに注文を変更できるかどうかを確認します user_deniedはリダイレクトとアラートを使用するメソッドです

于 2016-07-20T12:29:40.727 に答える
0

認証プラグインを確認することもできます。これを他の機能にも使用できるように設計することをお勧めします。ユーザーの ID を見つけるために、クライアント側のパラメーターに依存しないでください。詳細はこちら: http://www.rubyinside.com/authorization-permissions-plugin-for-rails-154.html

于 2012-06-18T21:03:33.813 に答える
0

基本的に、Rails の管理者 (または管理者をユーザーに) を作成し、それに検証を追加して、それらの検証で管理者の役割を設定する必要があります。

def set_admin

end 

before_action set-admin only :[:destroy, :update]

管理者を追加するときは、デフォルトでブール値を false に設定します

于 2019-03-27T17:22:41.437 に答える