2

現在、サインインに成功するとアプリがユーザーを自分のプロファイルにリダイレクトするようにアプリを設定していますがlocalhost:3000/users/id、私が最初のユーザーであり、このプロファイルに完全にアクセスできるid => 1と入力した場合. users/2私はdeviseを使ってこれを止める方法を見つけようとしています。私はレールにかなり慣れてbefore_filter :authenticate_user!いないので、単純なものが欠けていると確信しています. CanCanについて少し読んだことがありますが、これは私が達成しようとしていることに対して少しやり過ぎのようです。どんなポインタでも大歓迎です。

users_controller.rb

class UsersController < ApplicationController
  before_filter :authenticate_user!
  before_filter :user_authorization

  def index
    @users = User.all
  end

  def show

    @user = User.find(current_user[:id])

  end


  private

     def user_authorization
        redirect_to(root_url) unless current_user.id == params[:id]
     end
end 

これはサーバーから報告されています:

Started GET "/users/2" for 127.0.0.1 at 2012-06-24 13:00:38 +0200
Processing by UsersController#show as HTML
  Parameters: {"id"=>"2"}
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 2 LIMIT 1
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 2]]
Redirected to http://localhost:3000/
Filter chain halted as :user_authorization rendered or redirected
Completed 302 Found in 20ms (ActiveRecord: 0.8ms)
4

3 に答える 3

3

コントローラーで:

class UsersController < ApplicationController
  before_filter :validate_user, :only => :show

  def show
     @user = User.find(params[:id]
  end


  def validate_user
    redirect_to courses_path unless current_user.id.to_s == params[:id]
  end

end

current_user.id.to_scurrent_user.id は整数で、params[:id] は文字列であるため、注意してください。

于 2013-11-27T04:28:46.407 に答える
2

一般に、この種の問題を解決するには 2 つのアプローチがあると思います。

  1. 独自のコードをローリングし、コントローラー (または場合によってはモデル クラス) にチェックを実装する。
  2. ルールを強制する宝石を使用します。

自分で役割を果たしたい場合、最も簡単な方法は、コントローラーにチェックを入れて、自分のものではないプロファイルを見ようとした場合にリダイレクトされるようにすることです。before フィルターを使用してこれを行う 1 つの方法は次のとおりですが、アプリにとって意味のある動作に合わせて調整する必要があります。

  before_filter :validate_user
  def validate_user
    redirect_to home_path unless current_user and current_user.id == params[:id]
  end

gem を使用する場合は、前述の cancan または Acts as Tenant と呼ばれる別の gem をお勧めします。似たようなものに使われているのを見たことがあります。しかし、ユーザー プロファイルをロックダウンすることだけが必要な場合は、コントローラーにコードを追加することでおそらく問題なく動作します。

于 2012-06-24T10:06:16.803 に答える
1

そしてほら:

  before_filter :user_authorization

  private

     def user_authorization
        redirect_to(root_url) unless current_user.id == params[:id]
     end

current_user は、現在ログインしているユーザーを含むヘルパーです。

于 2012-06-24T10:08:25.580 に答える