deviseヒューマンマシン検証の使用

3064 ワード

現在主流の検証コード形式は以下の通りである.
  • 問答問題
  • 写真検証コード
  • ピクチャ検証コード
  • 1つ目は直接的で、主な問題は大量のデータを格納する必要があり、理論的に問題ライブラリが大きいほど解読しにくいことです.ここにはhumanizerを実現する2つ目は現実の写真を利用することであり、人間が写真を認識するのは簡単だが、機械は難しい.このような案が最も有名なのはGoogleが発売したrecaptchaサービスで、recaptchaはその実現に基づいている.3つ目は,提供された文字の組合せに基づいて画像を生成し,ユーザの入力を検証して人間かどうかを判断することである.ここで紹介するのは3つ目、simple_captcha2
    simple_captcha2
    まずdeviseをインストールするプロジェクトを用意します.実行rails g devise:controllers users rails g devise:views users編集config/rout.rb
    Rails.application.routes.draw do
      devise_for :users,controllers: {sessions: 'users/sessions'}
      ...
    end

    gem gem 'simple_captcha2', require: 'simple_captcha'実行bundle install
    rails generate simple_captcha [template_format] # Available options erb, haml. Default: erb
    rake db:migrate # Mongoid: skip this step and remove the migration
    
    application_controllers.rbに直接入れることもできます.
    html views/users/sessions/new.html.erbのformフォームに画像検証を追加します.
      
        
      

    controller controllers/users/session_controllers.rbに追加
    include SimpleCaptcha::ControllerHelpers

    書き換えcreate:
      def create
        if simple_captcha_valid?
          super
        else
          flash[:alert]="Captcha code is wrong,try again!"
          self.resource=resource_class.new(sign_in_params)
          respond_with_navigational(resource){render :new}
        end
      end

    テスト
    このときページをリフレッシュすると認証コードの欄が表示され、translation errorが表示され、en.ymlが設定される可能性があります.
    en:
      hello: "Hello world"
      simple_captcha:
        label: "Enter numbers.."
        placeholder: "Type here.."

    また、誤った認証コードを入力してログインすると認証コードエラー(flash)が提示されますが、ページをリフレッシュすると直接ログインに成功します.ここではdeviseがsimple_captcha2の検証結果をスキップして直接ログインに成功しましたが、ページはrespond_with_navigational(resource){render :new}の理由でスキップしませんでした.これは明らかに私たちが望んでいるものではありません.simple_captcha2の検証を機能させるべきです.
    方法1sessions_controller.rbskip_before_filter :require_no_authentication, :only => [:new,:create]を追加認証コードを入力し、ページをリフレッシュすると、ページがクラッシュし、エラーが表示されます.
    ActionController::InvalidAuthenticityToken in Users::SessionsController#create
    ActionController::InvalidAuthenticityToken
    Extracted source (around line #195):
    def handle_unverified_request
      raise ActionController::InvalidAuthenticityToken
    end
    end
    end

    方法2
    検証をcreateの前に置いて、コードを追加します.
    prepend_before_filter :captcha_valid,:only=> [:create]
    ...
    
    private
      def captcha_valid
        if simple_captcha_valid?
          true
        else
          flash[:alert]="Captcha code is wrong,try again!"
          self.resource=resource_class.new(sign_in_params)
          respond_with_navigational(resource){render :new}
        end
      end

    リファレンス
    [Deviseにsimple_captcha 2を加えて検証コード検証を行う](https://blog.csdn.net/qwbtc/a...
    完璧なRubyグラフィック認証コードGem