Rails アプリケーションで captcha を使う
Rails アプリで captcha を使いたかったので、github で公開されている captcha というプラグインを使ってみました。
zendesk's captcha at master - GitHub
http://github.com/zendesk/captcha
インストール
インストールするには事前に Git と RMagick のインストールが必要です。
開発用に使っている PC が Windows Vista なので、RMagick は前回(http://d.hatena.ne.jp/akishin999/20100203/1265217508)の通りにインストールを行いました。
Git は msysgit を使っています。
msysgit - Google Code
http://code.google.com/p/msysgit/
Git、RMagick が無事インストールされたら、コマンドプロンプトからプラグインをインストールする Rails アプリの直下まで移動して script/plugin install します。
>ruby script/plugin install git://github.com/zendesk/captcha.git
使用準備
まず、environment.rb に captcha 用のソルトを設定します。
以下のように何か適当な文字列を設定してください。
(適当なランダム文字列が思い浮かばない場合、Applet なので重いですが、よければこのあたりで生成して下さい)。
# captcha 用のソルト CAPTCHA_SALT = '1Xxa5tlOTUNEvGMkuDJmnpd6chis2Be'
environment.rb にソルトを設定したら captcha 画像を生成を行います。
コマンドプロンプトから Rails アプリ直下に移動し、以下のように rake captcha:generate を実行して下さい。
>rake captcha:generate COUNT=50 (in C:/rails_apps/captcha_example) Generating 50 captcha images off-line Writing image file 9a0e515fa043b52a9044fe6c33766be8df7149e5.png Writing image file 0f8a182a4b55fd501c4f3bc94fbe2895ba4c96f9.png Writing image file 76b26e04f29666246cd82b39a6ea488fdb3b10d8.png Writing image file 478f122febfa9ffcb55e2650b7d4b544e5067e69.png Writing image file 04508bd81e0edf8dc3afad04f89926d7a80a3802.png ・ ・ ・
生成された captcha 画像は「public/system/captcha」以下に保存されます。
rake captcha:generate で指定可能なオプションは以下の通りです。
オプション | 内容 | デフォルト |
---|---|---|
COUNT | 生成する画像の枚数 | 3 |
IMAGE_HEIGHT | キャプチャ画像の高さ(ピクセル) | 50 |
IMAGE_WIDTH | キャプチャ画像の幅(ピクセル) | 260 |
CAPTCHA_LENGTH | キャプチャ画像の中に描画する文字数 | 5 |
FILE_FORMAT | 生成される画像ファイルのフォーマット(PNGまたはGIF) | png |
使ってみる
まず View では、captcha_input_text、captcha_image、captcha_hidden_text の三つを以下のように form_tag の中に記述します。
<h1>Example#index</h1> <p style="color: green"><%= flash[:notice] %> <% form_tag( {:controller => :example, :action => :create} ) do -%> <%= captcha_input_text('下の画像の中に表示されている文字を入力してください:') %><br /> <%= captcha_image %> <%= captcha_hidden_text %> <br /> <%= submit_tag '送信' %> <% end -%>
公式にあるように
<%= captcha_block %>
の一行でも良いのですが、View のレイアウトを細かく弄れるように上記の使い方を選択しました。
次に Controller です。
class ExampleController < ApplicationController validates_captcha def create if captcha_validated? flash[:notice] = 'captcha is valid.' else flash[:notice] = 'captcha is invalid.' end render :action => :index end def index end end
まず Controller の先頭で「validates_captcha」と記述します。
あとは View からの Submit 先となる action 内で captcha_validated? メソッドを使う事で captcha 画像内の文字列が正しく入力されたかを検証できます。
たったこれだけのコードで captcha が実装できるのはお手軽でいい感じですね。
ちなみに、上記サンプルを作成した Rails のバージョンは 2.3.5 になります。