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と連携は取れそうになさそうですが。
コメント