cakePHPでさくっと認証を作る (会員追加) recaptchaとか。

会員を追加する機能をcakePHPで作ってみませうという企画。


・目指すもの

メール、パスワードを確認のために二回入力させる。画像認証でスパムを防止する。

仮登録メールをクリックしたら、本登録完了。


(とりあえず、今回は二回入力と画像認証まで)


・準備するもの
CakePHP2.x (最新版が良いんじゃない?)

recaptchaのプラグイン https://github.com/lamanabie/cakephp-recaptcha


開発環境は各自で。


まず、ざっと書いてしまうね。

レシピ1 

Viewを作る。

<div class="admin form">
        
<?php

echo $this->Form->create('User', Array('url' => '/admin/add'));
        echo $this->Form->input('email');
        echo $this->Form->input('メールをもう一度入力して下さいな');
        echo $this->Form->input('password');
        echo $this->Form->input('パスワードをもう一回入力して下さい');
        echo $this->Recaptcha->display();  
        echo $this->Form->end('アカウントを作成する');
?>
</div>

気になる

echo $this->Recaptcha->display();

については後で言います。


レシピ2

モデルにバリデーションとか、二回チェックする関数とか書く。とりあえず、書く

<?php
class User extends AppModel {
    public $name = 'User';
    public $validate = Array(
        'email' => Array(
        'notempty'=>array(
                'rule' =>array('notempty'),
                'message' => 'メールアドレスを入力してください。',
            ),
            
        'isUnique'=>array(
                'rule'=>'isUnique',
                'message'=>'このメールアドレスは既に使われています',
        ),
        
        'email'=>array(
          'rule'=>array('email',true),
          'message'=>'メールアドレスの形式として不正です。
申し訳ありませんが、他のメールアドレスを記入して下さい',
     ),
    ),
    
        'メールをもう一度入力して下さいな'=>Array(
        'notempty'=>array(
        'rule'=>array('notempty'),
        'message'=>'入力されていません',
        ),
        'email'=>array(
		'rule'=>array('emailcorrespond'),
		'message'=>'メールアドレスが一致しません',
		),
        ),
       
        'password' => Array(
          'notempty'=>array(
                'rule' => Array('notEmpty'),
                'message' => 'パスワードを入力してください。',
             ),
             
                'custom'=>array(
                'rule'=>array('custom','/^[a-zA-Z0-9]{6,}$/i'),
                'message'=>'パスワードは半角英数六文字以上で入力して下さい',
            ),
        ),
        
        'パスワードをもう一回入力して下さい'=>array(
        'notempty'=>array(
        'rule'=>array('notempty'),
        'message'=>'どうして入力しないの? バカなの? 死ぬの?',
        ),
        'password'=>array(
		'rule'=>array('correspond'),
		'message'=>'パスワードが一致しません',
		),
		
        ),
public function correspond($check){
	return($check['パスワードをもう一回入力して下さい']
==$this->data['User']['password']);
	
}

public function emailcorrespond($emailcheck){
	return($emailcheck['メールをもう一度入力して下さいな']
==$this->data['User']['email']);
}

}

?>


レシピ3
さっき落としたこれ(https://github.com/lamanabie/cakephp-recaptcha)を解凍して、Recaptchaにリネームして、app/pluginに置く。

config/bootstrap.php

で読み込む。あと、リキャプチャのAPIとか書く

CakePlugin::load('Recaptcha',array('bootstrap'=>true));

Configure::write('Recaptcha.publicKey', 'your-public-api-key');
Configure::write('Recaptcha.privateKey', 'your-private-api-key');

こんな感じ。

レシピ4
コントローラーに色々書く

<?php
(前略)
//コンポーネントに追加してね。

 public  $components = Array(
'Recaptcha.Recaptcha'=>array('actions'=>array('add','delete')),
);

(中略)

 public function add() {
    	
        if($this->request->is('post')) {
            $this->User->create();
            if ($this->User->save($this->data)) {
                $this->Session->setFlash(__('The user has been saved'));
                //ユーザーが追加されたら自動ログインして、マイページへと飛ばす
                
                $this->Auth->login();
                $this->redirect(array('action' => 'mypage'));
				
            } else {
                $this->Session->setFlash(__('The user could not be saved.
 Please, try again.'));
            }
	}
}


(後も略)
?>


ざっとこんな感じ。すごい簡単ですね。
プラグインさまさまだぁ。


あとはauthコンポーネントの設定とかすれば良いだけ。
詳しくは
http://book.cakephp.org/2.0/ja/core-libraries/components/authentication.html
とか読んで下さい。

リキャプチャのAPIは(http://www.google.com/recaptcha)ここで取ってね。

最近グーグルの野郎に買われたよ。グーグル先生怖い。


Gメールも携帯番号で認証だし。個人情報がぁーーーーーーー。



特に難しいところもないかなぁと。

プラグインのおかげで

echo $this->Recaptcha->display();

たったの一行でリキャプチャ画像が出ます。

詳しいパラメータとかはプラグインの解説読んで下さい。

https://github.com/lamanabie/cakephp-recaptcha

間違ったキャプチャを入力すると、
Incorrect captchaって出ます。

正解の入れたら何も表示されずにユーザーが登録されます。

フラッシュは$this->Session->setFlash(__('ほげほげほげ'), 'default', array(), 'auth');

とか書いたらいいかもね。しらんけど。


付記・
はてなの改行がよくわからんくて、変なところで改行しております。すいません。

そろそろ別のブログサービスに移行するかな。

レシピ2の言葉がところどころ変なのは酔ってる時に書いたからです。多分。