私はdeviseのおかげで多くのユーザーがいて、いくつかの問題メーカーを禁止したいと思います。 Deviseにはこのサポートが組み込まれていますか?
ありがとう
私は自分のプロジェクトでこれを実装しました。私がしたことは上記の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に慣れていないので、このすべてが全体を因数分解する「最良の」方法であるかどうかはわかりませんが、すべてがうまくいき、少なくとも良いスタートを切ることを願っています。
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
ログイン時にユーザーアカウントのステータス検証をカスタマイズする
ログインする前にユーザーにカスタム検証を追加したい場合があります。この場合、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"