0

現在私のプロジェクトでは、ユーザーが「1」のIDを持っているかどうかを確認する方法があります。彼は特定のアクションへのアクセスを許可されています。認証にはdevise gemを使用しました。

これが私のコードリファレンスです

before_filter :find_xxx, :only => [:edit, :update, :destroy, :create, :new]

そしてここにコードがあります

  protected    
def find_xxx
  if user_signed_in? && current_user.id != 1
      redirect_to "/", :notice => "Not today"
  end
end

Rails の公式ドキュメントを見たところ、同様の方法でアプローチされていました。これが私のアクションを保護する安全な方法なのだろうかと思っていました。アクションを実行するために、/post を使用してフォームを HTML に追加することはできません。

私のメソッドを保護する最善の方法は何ですか。

お時間をいただきありがとうございます。事前にご協力いただきありがとうございます。

4

1 に答える 1

2

Devise 認証が適切に機能していると仮定すると、それcurrent_userが認証され、フォームを送信する前にフォームを操作して認証をこっそり通り抜けることはできません。

ただし、フィルターのロジックを逆にする必要があります。現状では、ユーザーは最初にサインインしないだけでリダイレクトをバイパスできるためです ( にuser_signed_in?なるためfalse)。コントローラーのアクションにアクセスする前にサインインを強制する別のフィルターまたは認証要件がある場合は、それで十分な場合があります。

安全のために、条件を次のように変更します。

unless user_signed_in? && current_user.id == 1

通常、このように特定のデータベース ID に依存することはお勧めできません。管理者ロールを作成したり、 CanCanのような gem を使用してより明示的なセキュリティを作成したりすることをお勧めします。

セキュリティを確保するために、常にこのようなものに関連するテストを作成する必要があります。

于 2013-03-13T03:18:36.967 に答える