web-dev-qa-db-ja.com

Rails + Devise-ユーザーがログインしたりパスワードをリセットしたりできないようにユーザーを禁止する方法はありますか?

私はdeviseのおかげで多くのユーザーがいて、いくつかの問題メーカーを禁止したいと思います。 Deviseにはこのサポートが組み込まれていますか?

ありがとう

34
AnApprentice

私は自分のプロジェクトでこれを実装しました。私がしたことは上記のKleberに似ていて、これをapp/controllers/sessions_controller.rb(Deviseをオーバーライドする)で定義しました...

class SessionsController < Devise::SessionsController

protected

  def after_sign_in_path_for(resource)
    if resource.is_a?(User) && resource.banned?
      sign_out resource
      flash[:error] = "This account has been suspended for violation of...."
      root_path
    else
      super
    end
   end

end

次に、「banned」というブール列をユーザーに追加したので、モデレーターはバックエンドでユーザーを編集するときにチェックボックスをオンにすると、ブール値はtrueを返します。

しかし、1つの欠陥がありました...ユーザーがすでにログインしていて禁止されている場合、少なくともセッションが期限切れになるかログアウトするまで、ユーザーはサイトで何かを行うためのアクセス権を持っていました(コメントなど)。だから私はapp/controllers /application_controller.rbでこれをしました...

class ApplicationController < ActionController::Base
  before_filter :banned?

  def banned?
    if current_user.present? && current_user.banned?
      sign_out current_user
      flash[:error] = "This account has been suspended...."
      root_path
    end
  end
end

禁止が検出された場合は、自動的にログアウトします。とにかく、私はRailsに慣れていないので、このすべてが全体を因数分解する「最良の」方法であるかどうかはわかりませんが、すべてがうまくいき、少なくとも良いスタートを切ることを願っています。

31
Shannon

authenticatable.rb のデバイスドクから:

Deviseは、ユーザーを認証する前に、各リクエストで、model.active_for_authentication?を呼び出して、モデルがアクティブかどうかを確認します。このメソッドは、他のデバイスモジュールによって上書きされます。たとえば、:confirmableは.active_for_authenticationを上書きしますか?モデルが確認された場合にのみtrueを返します。

このメソッドは自分で上書きしますが、上書きする場合は、superを呼び出すことを忘れないでください。

def active_for_authentication?
  super && special_condition_is_valid?
end

したがって、ユーザーデータベースにフラグblockedがある場合、ユーザーモデルのメソッドは次のようになります。

def active_for_authentication?
  super && !self.blocked
end
86
Frank

ログイン時にユーザーアカウントのステータス検証をカスタマイズする

ログインする前にユーザーにカスタム検証を追加したい場合があります。この場合、account_activeブール値(trueまたはfalse)チェックを実装する必要がありました。したがって、trueの場合、ユーザーはログインしてセッションを作成できます。falseの場合、「アカウントがアクティブではありません」というエラーが表示されます。

Active_for_authenticationを上書きしますか?モデル(ユーザー)のメソッドを作成し、検証ロジックを追加します。スーパー&&(trueまたはfalse)を返したい

  def active_for_authentication?
    # Uncomment the below debug statement to view the properties of the returned self model values.
    # logger.debug self.to_yaml

    super && account_active?
  end

この場合、ブール値をaccount_activeにチェックし、その値を呼び出したサインインメソッドに返します。

元のactive_for_authentication?メソッドはdevise/lib/devise/models /authenticatable.rbにあります。

注:active_for_authentication?ユーザーを認証した後、後続の各リクエストでDeviseによって呼び出されます。これは、active_for_authenticationのオーバーライドに追加するコードを意味しますか?ユーザーのセッション中のすべてのリクエストに対して実行されます。

注:active_for_authentication? database_authenticatableを使用する場合、リクエストごとに呼び出されません。ログイン時にのみ呼び出されます。これが意図された動作であるかどうかはわかりません。

エラーメッセージのカスタマイズ

メソッド「active_for_authentication?」の場合falseを返し、メソッド 'inactive_message'が呼び出され、ユーザーは非アクティブであるという通知を受け取ります。メッセージもカスタマイズする必要があります。

  def inactive_message
    account_active? ? super : :account_inactive
  end

これで、「inactive」ではなく「account_inactive」のカスタムメッセージが参照されます。これは、デバイスの翻訳ファイルで定義する必要があります。

 devise:
     failure:
       inactive: 'Your account was not activated yet.'
       account_inactive: 'Your account is not active.'
     registrations:
       signed_up_but_account_inactive: "Thanks for signing up. We'll let you know when your account is active"
1
Marcelo Austria