1

私は Pundit と Devise の両方をセットアップしており、Rails アプリで正しく動作しています。ただし、サインアップ時にユーザーに自分の役割を決定させる方法がわかりません。

この時点で:

  • Devise の新しいビューに渡される URL パラメータがあります。
  • form_for で、role という隠しフィールドを param の値に設定します。

これは機能します。

しかし、悪意のあるユーザーがこのパラメーターを「管理者」に変更して、管理者になっているのではないかと心配しています。

これをどのように処理すればよいですか?管理者を作成するときに問題が発生するため、モデルに制限を加えたくありません。そこにチェックを入れるには、デバイス登録コントローラーをオーバーライドする必要がありますか?

4

2 に答える 2

1

かなりの量のグーグルの後、答えがあります。最初に、ロールのモデルにいくつかの検証を貼り付けますActive Record Validations Guide: 2.6 include: validator オプションを参照してください

この後、役割が正しいことを確認するために検証されます。もちろん、ルックアップ テーブルも使用できます。次に、2 つのオプションがあります。

  1. 新しいレコードには、条件付きの before_saveコールバックを使用します。次に、新しいレコードが保護する役割を持っているかどうかを確認し、そうであればエラーを発生させます。後でキャッチするには (オーバーライドされたデバイス コントローラーで (2 番目のオプションを参照)。
  2. Devise 登録コントローラーをオーバーライドするこの SO の質問を参照してください。そして、完全にオーバーライドされた作成アクションにいくつかのチェックを入れます。セッションを使用して、新しいアクションに渡された url パラメータを保存します (これも完全にオーバーライドする必要があります)。次に、作成アクションが失敗して new にリダイレクトされた場合でも、セッション内のロールに引き続きアクセスできます (パラメーターを操作しない限り、URL からパラメーターがクリアされるため)。

いずれにせよ、登録コントローラーをオーバーライドする必要がありますが、それは単なるケースです。

Punditだけでこれを行う方法があると思います。しかし、私はまだそれを機能させることができていません。

于 2014-04-10T09:29:39.790 に答える
1

あなたがやろうとしていることのためにDeviseのRegistrationsControllerものをオーバーライドする必要はありません。

管理者が任意のロール セットを持つユーザーを作成できるようにするには、独自のコントローラーを使用するだけです。Devise では、ユーザーを自分で簡単に作成できるため、これを処理するコントローラーを作成するだけで済みます。もちろん、管理者のみがこの機能を使用できるように、Pundit を使用して保護することを忘れないでください。

Confirmableモジュールを使用する場合、このアプローチは引き続き機能します。ただし、ユーザーの作成時に確認メールが送信されないためuser.confirm!、モデルを保存した後に電話してすぐにアカウントのロックを解除するか、 を使用して確認メールを手動で送信する必要がありますuser.send_confirmation_instructions

編集:

この Pundit ポリシーは、あなたがやろうとしていることにうまくいくかもしれませんし、うまくいかないかもしれません。Pundit のメソッドを使用するには、ここでcreateDevise のアクションをオーバーライドする必要があります。念のため、ロール リストを別の場所 (モデル内など) に移動する必要もあります。RegistrationsControllerauthorize

class UserPolicy < Struct.new(:current_user, :target_user)    
  def create?
    registration_roles.include?(target_user.role) if current_user.nil?
  end

  private

  def registration_roles
    %w(RED BLU Spectator)
  end
end
于 2014-04-10T16:25:09.860 に答える