Backup of blog/2008-04-18 (2) Back


Back to History list

#navi(../)
*cakePHPのユーザ認証 [#q05ba98e]
基本的に不特定多数が使用するWebアプリではユーザ認証を必要とする。フォーラムやmixiのようなSNS、ポータルサイトで使われるXoopsに代表されるようなCMSでは、サイトに投稿する前に、まずユーザ登録をするだろう。webの世界では、2ちゃんねるやwikiのようなだれでも投稿できるというのは、実際少数である。

あなたは、掲示板やblogサイトを利用していて度重なるスパム攻撃に遭ったことはないだろうか?これは、善意でコメント欄を用意しているのを悪用して、検索エンジンにクロールしてもらうよう対象となるURLを入れるのが目的である。誤クリックを狙うのが一般的だったが、最近では人間がアクセスすることを前提としていない。いずれにせよ、身元不詳の投稿にはロクなものがない。

ユーザ認証を入れる最大の理由はこれである。もちろん、ただユーザ認証すればいいというものではない。やはり本人確認が必要になってくる。そこで、本人確認にメールアドレスを使うのが一般的だ。もちろん、捨てアカウントメールというのがあるくらい完璧なものではないが・・・。

まぁ、とりあえずユーザ認証処理を入れてみよう。自分がMML投稿サイト開発用に使っているフレームワーク:cakePHP1.2ではAuthコンポーネントと呼ばれるユーザ認証処理専用のプログラムが用意されている。では、早速コーディングだ。

とりあえず、最小限のテーブルを作成。
#code(sql){{
--
-- テーブルの構造 `users`
--

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(12) character set ascii default NULL COMMENT 'ユーザ名',
  `password` varchar(64) character set ascii default NULL COMMENT 'パスワード',
  `email` varchar(32) collate utf8_unicode_ci NOT NULL COMMENT 'メールアドレス',
  `created` datetime NOT NULL COMMENT '作成日',
  `modified` datetime NOT NULL COMMENT '修正日',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `email` (`email`),
  UNIQUE KEY `username` (`username`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;
}}

次にmodel側。適当にbakeを用いて作成しよう。バリテーションは以下のようにする。アソシエーションなどは省略
#code(php){{
var $validate = array(
		'id' => array('numeric'), // 数字のみ
		'username' => array('alphanumeric','unique','required' => true), // 英数字、ユニーク値、省略不可
		'email' => array('email','unique','required' => true,), // メール、ユニーク値、省略不可
		'password' => array('alphaNumeric','required' => true) //英数字、省略不可
	);
}}

で、controller。
#code(php){{
<?php
class UsersController extends AppController {
	var $name = 'Users';
	var $helpers = array('Html', 'Form');
	// AuthComponentの宣言
	var $components = array('Auth');

	//beforeFilterにログインしなくても良いactionを指定
	function beforeFilter() {
		$this->Auth->allow('register');
	}

	//ログイン
	function login(){
		$this->pageTitle = __('Login',true);
	}

	//ログアウト
	function logout(){
		$this->pageTitle = __('Logout',true);
		$this->Session->setFlash(__('You have been logout.',true));
		$this->Auth->logout();
		$this->redirect(array('action' => 'index'));
	}

	//ユーザ追加
	function add($register = null) {
		$this->pageTitle = __('User Registration',true);

		if (!empty($this->data)) {
			$this->User->create();

			// 保存処理
			if ($this->User->save($this->data)) {
				$this->Session->setFlash(__('The User has been saved', true));
				$this->redirect(array('action'=>'/'));
			} else {
				$this->User->setFlash(__('The User could not be saved. Please, try again.', true));
			}
		}
	}

	function register() {
		$this->setAction('add');
	}

}
?>
}}