symfonyで画像認証を使う

最近では一般的になりつつあるCAPTCHA(画像認証)をsymfonyで使ってみた手順メモ。設定すると以下のようなキャプチャがフォームで利用できます。

sfCryptoCaptchaPlugin

プラグインであるだろうと思い、探してみつけたのが、sfCryptoCaptchaPlugin
ただし、Readme通りにやってもうまくいかない箇所がいくつかあるので実際に動作した手順のメモ

プラグインのインストール

plugin:installコマンドが通らなかったので、svnでチェックアウトしてくる。

$ mkdir plugins/sfCryptoCaptchaPlugin
$ cd plugins/sfCryptoCaptchaPlugin
$ svn co http://svn.symfony-project.com/plugins/sfCryptoCaptchaPlugin/trunk .
プラグインを有効にする

プロジェクトでプラグインを有効にする。以下の例はenablePluginsで設定している場合。enableAllPluginsExceptで設定している場合は何も書かなくても読み込まれるはず。

  • config/ProjectConfiguration.class.php
<?php
..
      $this->enablePlugins(array('sfCryptoCaptchaPlugin'));

次に、キャプチャ画像の再読み込みで利用するモジュールを利用できるように有効にしておく

  • apps/アプリーション名/config/setting.yml
all
  .settings:
    ....
    enabled_modules:        [default, sfCryptoCaptcha]

最後に、プラグインの画像関連のファイルをweb以下に配置するために、コマンドを叩く

$ symfony plugin:publish-assets
$ symfony cc

ウィジットの設定

入力欄はテキストボックスで、バリデーターはインストールしたプラグインで用意されているsfValidatorSfCryptoCaptchaを使う。
書き方は色々ありますが、とりあえず、captchaの部分だけを既存フォームに追加できるような書き方で説明。

  • フォームクラス(HogeForm.class.php)にウィジットを追加
<?php
...
    // captcha
    $key = "captcha";
    $this->widgetSchema[$key] = new sfWidgetFormInput();
    $this->widgetSchema->setLabel($key, '画像認証');
    $this->validatorSchema[$key] = new sfValidatorSfCryptoCaptcha();
    $this->validatorSchema[$key]->setOption('required', true);
    $this->validatorSchema[$key]->setOption('trim', true);
    $this->validatorSchema[$key]->setMessage('required', '画像の数字を入力してください');
    $this->validatorSchema[$key]->setMessage('wrong_captcha', '認証できませんでした。再度入力してください');

テンプレートには認証画像を表示するために、以下のようにコードを追加する

  • フォームを表示するテンプレート(editSuccess.php)にヘルパーの読み込みと認証画像表示部分を追加
<?php use_helper('sfCryptoCaptcha'); ?>

<table>
<?php echo $form ?>
<tr>
  <td colspan="2" style="text-align: center"><?php echo captcha_image(); echo captcha_reload_button(); ?></td>
</tr>
</table>

これで、冒頭にあったような画像認証ができあがり。簡単ですね。

カスタマイズ方法

画像認証の基本設定はプラグインのconfig/app.ymlに書かれてあります。
これを自分のapp.ymlで書けば上書きできます。

たとえば、画像認証で利用する文字を数字のみにしたい場合は

  • apps/アプリケーション名/config/app.yml
all:
  sf_crypto_captcha:
  #Authorized characters
    chars_used:                       '0123456789'  # characters used for random captchas without "easy" option

と書けばOK。