CakePHP ユーザー登録機能を作成する。

CakePHPでユーザー登録プロセスを作成する。

ユーザー参加型のwebサービスでは、当然必修になるユーザー登録機能をCakePHPで実装しようとおもいます。
ぐぐってみたら、 CakeDC / users がよさそうな感じ。

参考サイト

https://github.com/CakeDC/users/blob/master/readme.md
http://cakephp2.pro-mame.com/index.php?%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%2FCakeDC%2Fusers
http://blog.pseudepigrapha.net/php/26/

ダウンロード

https://github.com/CakeDC/users

ユーザーテーブルの作成

解凍してフォルダの名前をusersへ、全てを/app/Pluginフォルダに入れます。
スキーマにしたがってユーザーテーブル作ってもらいます。

$cd /path/to/cakephp/
sudo ./app/Console/cake schema create users --plugin Users

Welcome to CakePHP v2.3.0 Console
---------------------------------------------------------------
App : app
Path: path/to/cakephp/app/
---------------------------------------------------------------
Cake Schema Shell
---------------------------------------------------------------

The following table(s) will be dropped.
user_details
users
Are you sure you want to drop the table(s)? (y/n)
[n] > y
Dropping table(s).
user_details updated.
users updated.

The following table(s) will be created.
user_details
users
Are you sure you want to create the table(s)? (y/n)
[y] > y
Creating table(s).
user_details updated.
users updated.
End create.

できたテーブルはこちら。

--
-- テーブルの構造 `users`
--

CREATE TABLE IF NOT EXISTS `users` (
`id` varchar(36) NOT NULL,
`username` varchar(255) NOT NULL,
`slug` varchar(255) NOT NULL,
`password` varchar(128) DEFAULT NULL,
`password_token` varchar(128) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`email_verified` tinyint(1) DEFAULT '0',
`email_token` varchar(255) DEFAULT NULL,
`email_token_expires` datetime DEFAULT NULL,
`tos` tinyint(1) DEFAULT '0',
`active` tinyint(1) DEFAULT '0',
`last_login` datetime DEFAULT NULL,
`last_action` datetime DEFAULT NULL,
`is_admin` tinyint(1) DEFAULT '0',
`role` varchar(255) DEFAULT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `BY_USERNAME` (`username`),
KEY `BY_EMAIL` (`email`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- テーブルの構造 `user_details`
--

CREATE TABLE IF NOT EXISTS `user_details` (
`id` varchar(36) NOT NULL,
`user_id` varchar(36) NOT NULL,
`position` float NOT NULL DEFAULT '1',
`field` varchar(255) NOT NULL,
`value` text,
`input` varchar(16) NOT NULL,
`data_type` varchar(16) NOT NULL,
`label` varchar(128) NOT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UNIQUE_PROFILE_PROPERTY` (`field`,`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CakeDC Search pluginも必要で、こちらはpluginフォルダにほり込んどけばいいということなので、こちらもダウンロードしてフォルダに入れておきます。

e-mailの設定

emailの設定をしておきます。以前行った部分のConfig 設定だけやっておけばOKかな。

class EmailConfig {
public $default = array(
'transport' => 'Smtp',
'from' => array('*****@gmail.com' => '表示名'),
'host' => 'ssl://smtp.gmail.com',
'port' => 465,
'timeout' => 30,
'username' => '*****@gmail.com',
'password' => '******',
'log' => true//ここをtrueにするとtmp/debug.logにメールのログが書かれる。
//'headerCharset' => 'utf-8',
);
}

プラグインのロード

CakePHP2.0 の変更点として、プラグインは app/Config/bootstrap.php から手動でロードが必要です。

/app/Config/bootstrap.phpファイルに追加

CakePlugin::load('Users');
CakePlugin::load('Search');
CakePlugin::load('Utils');

appControllerAppController.php

class AppController extends Controller {

public $components = array('RequestHandler', 'Session', 'Auth', 'Cookie');

public function restoreLoginFromCookie() {
$this->Cookie->name = 'Users';
$cookie = $this->Cookie->read('rememberMe');

if (!emptyempty($cookie) && !$this->Auth->user()) {
$data['User'][$this->Auth->fields['username']] = $cookie[$this->Auth->fields['username']];
$data['User'][$this->Auth->fields['password']] = $cookie[$this->Auth->fields['password']];
$this->Auth->login($data);
}
}
function beforeFilter() {
parent::beforeFilter();
$this->Auth->fields = array('username' => 'email', 'password' => 'passwd');
$this->Auth->loginAction = array('plugin' => 'users', 'controller' => 'users', 'action' => 'login', 'admin' => false);
$this->Auth->loginRedirect = '/users';
$this->Auth->logoutRedirect = '/';
$this->Auth->authError = __('Sorry, but you need to login to access this location.', true);
$this->Auth->loginError = __('Invalid e-mail / password combination. Please try again', true);
$this->Auth->autoRedirect = false;
$this->Auth->userModel = 'Users.User';
$this->Auth->userScope = array('User.active' => 1);
$this->restoreLoginFromCookie();
}
}

ここまでできたら、

users/users/login

でアクセスするとログイン画面が表示されます。メールも飛んでくるし、パスワードリセットもあるし、ほぼ完璧です。ACLと連携は取れそうになさそうですが。

コメント

タイトルとURLをコピーしました