- ActiveRecordモデルに
Spammable。 - コントローラに
mark_as_spamアクションのサポートを追加します。 - サービスの execute メソッドに
check_for_spamへの呼び出しを追加します。
モデルとサービススパム保護とCAPTCHAサポート
REST API、GraphQL API、またはWeb UIにスパムやCAPTCHAのサポートを追加する前に、まず必要なサポートを追加する必要があります:
- バックエンドの ActiveRecord モデル。
- サービス層。
サポートしているスパムや CAPTCHA リクエストの実装の種類にかかわらず、以下の変更のすべて、あるいはほとんどが必要です。完全に GraphQL API をベースとした新しい機能の中には、コントローラを持たないものもあり、その場合はmark_as_spam アクションをコントローラに追加する必要はありません。
そのためには
-
ActiveRecord モデルに
Spammableサポートを追加. -
コントローラに
mark_as_spamアクションのサポートを追加. -
サービスの execute メソッドに
check_for_spamへの呼び出しを追加.
ActiveRecordモデルにSpammable 。
-
モデルクラスに
Spammableモジュールをインクルードします:include Spammable -
attr_spammableを追加することで、どのフィールドがスパムチェックされるかを示すことができます。モデルあたり最大2つのフィールドがサポートされます: “title” と “description” です。どのフィールドを “title” または “description” とみなすかを指定することができます。例えば、この行はcontentフィールドをdescriptionとして指定します:attr_spammable :content, spam_description: true -
#check_for_spam?メソッド実装を追加します:def check_for_spam?(user:) # Return a boolean result based on various applicable checks, which may include # which attributes have changed, the type of user, whether the data is publicly # visible, and other criteria. This may vary based on the type of model, and # may change over time as spam checking requirements evolve. end必要なロジックチェックの例については、このメソッドの他の既存の
Spammableモデルの実装を参照してください。
コントローラにmark_as_spam アクションのサポートを追加します。
SpammableActions::AkismetMarkAsSpamAction モジュールは、#mark_as_spam アクションのサポートをコントローラに追加します。このコントローラにより、管理者は関連するSpammable モデルのスパムを管理エリアページのスパムログセクションで管理できるようになります。
-
SpammableActions::AkismetMarkAsSpamActionモジュールをコントローラに組み込みます。include SpammableActions::AkismetMarkAsSpamAction -
#spammable_pathメソッドの実装を追加します。スパム管理ページは、編集後にこのページにリダイレクトします。必要なパスロジックの例として、既存のコントローラのこのメソッドの実装を参照してください。一般的には、Spammableモデルのコントローラの#showアクションとします。def spammable_path widget_path(widget) end
サービスの execute メソッドにcheck_for_spam への呼び出しを追加します。
この方法は、スパム可能な属性を永続化できるすべてのサービスに適用されます:
-
app/services、該当するCreateまたはUpdateサービスの中で、モデルのcheck_for_spamメソッドを呼び出します。 - スパム検査に失敗した場合
- エラーはモデルに追加され、そのモデルは無効となり、保存されなくなります。
-
needs_recaptchaプロパティはtrueに設定されます。
モデルに対するこれらの変更により、後続のバックエンドおよびフロントエンドの CAPTCHA ロジックによる処理が可能になります。
関連する各サービスにこれらの変更を加えてください:
-
executeメソッドの中で、モデルのcheck_for_spamメソッドを呼び出します。before_createbefore_update(このメソッドは名前付き引数を使用するので、既存の例を参照すれば使い方は明らかです。しかし、2つの重要な考慮事項があります:-
check_for_spamは、保存されていない(そしてダーティな)Spammableモデルインスタンスに必要なすべての変更が行われた_後に_実行されなければなりません。この順序付けにより、スパムチェックされるスパム可能な属性が確実に存在するようになります。 -
check_for_spamは、モデルにエラーがないかチェックされ、saveを試みる_前に_実行されなければなりません。モデルの変更された属性に潜在的なスパムが検出された場合、保存を阻止しなければなりません。
-
module Widget
class CreateService < ::Widget::BaseService
# NOTE: We add a default value of `true` for `perform_spam_check`, because spam checking is likely to be necessary.
def initialize(project:, current_user: nil, params: {}, perform_spam_check: true)
super(project: project, current_user: current_user, params: params)
@perform_spam_check = perform_spam_check
end
def execute
widget = Widget::BuildService.new(project, current_user, params).execute
# More code that may manipulate dirty model before it is spam checked.
# NOTE: do this AFTER the spammable model is instantiated, but BEFORE
# it is validated or saved.
widget.check_for_spam(user: current_user, action: :create) if perform_spam_check
# Possibly more code related to saving model, but should not change any attributes.
widget.save
end
private
attr_reader :perform_spam_check