2016-01-31

PHPでユーザー管理するならSentinelが便利すぎる!

カナダからの帰国後気持ち的にも少し落ち着いてきたので、ここいらでよく利用しているパッケージの使い方を再度おさらいしようというモチベーションが(なぜか)高まってきました。
そこで、今回は機能が豊富でとても使いやすいユーザー管理パッケージ「Sentinel」をご紹介したいと思います。



【Sentinelの感想】まさにかゆいところに手が届く感謝感激のパッケージです!


1.まずは主な特徴
  • ログイン/ログアウト(当たり前ですけど^-^;)
  • ユーザーに役割をもたせられる
  • パスワードリマインダー機能
  • パスワードを自動で暗号化して保存
  • ユーザー登録時のアクティベーション機能(選択可)
  •  ユーザー名(姓と名)をデフォルトで保存可能
などなど。
あとは私の大好物、Laravelにも対応しています。(バージョン>=5.0)


2.次にインストール

PHPの自動パッケージ管理システム composer でインストールします。
composerは便利すぎて一度使うとやめられませんね(笑)
こんなカンジです。
composer require cartalyst/sentinel "2.0.*"

3-1.初期設定(Laravel)

Laravelで利用するには、app.php の中にある providers へ ServiceProviderを追加。
 'providers' => [  
   Cartalyst\Sentinel\Laravel\SentinelServiceProvider::class,  
 ]  
aliases へ以下3つを追加
  'aliases' => [  
     'Activation' => Cartalyst\Sentinel\Laravel\Facades\Activation::class,  
     'Reminder'  => Cartalyst\Sentinel\Laravel\Facades\Reminder::class,  
     'Sentinel'  => Cartalyst\Sentinel\Laravel\Facades\Sentinel::class,  
 ]  
あとは、データベースにテーブルを作成して完了です。
便利なので migration で一気に作成しましょう。

※注意

DBテーブル名の衝突をさけるためにデフォルトで存在する「users」作成マイグレーションは事前に削除するかプログラム部分をコメントアウトしておきましょう。
私の環境では「2014_10_12_000000_create_users_table.php」でした。

(1)Publish でmigrationファイルをパッケージからコピー
php artisan vendor:publish --provider="Cartalyst\Sentinel\Laravel\SentinelServiceProvider"
(2)Migration 実行
php artisan migrate

3-2.初期設定(Laravel以外)

illuminate/database パッケージがあれば通常のPHPからでも利用できるようです。
(ただし、この部分は検証していません。なにぶんLove Laravelなもので、、、^^;)
composer require illuminate/database
でインストールして以下のように設定をします。

(以下本家ページからの引用)
 // 必要なクラスをインポート
 use Cartalyst\Sentinel\Native\Facades\Sentinel;  
 use Illuminate\Database\Capsule\Manager as Capsule;

 // autoloadを読み込む
 require 'vendor/autoload.php';

 // Eloquent Capsule インスタンスを生成
 $capsule = new Capsule;  
 $capsule->addConnection([  
   'driver'  => 'mysql',  
   'host'   => 'localhost',  
   'database' => 'sentinel',  
   'username' => 'user',  
   'password' => 'secret',  
   'charset'  => 'utf8',  
   'collation' => 'utf8_unicode_ci',  
 ]);  
 $capsule->bootEloquent();  
そして、DBの構造はこんな感じです。
 CREATE TABLE IF NOT EXISTS `activations` (  
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  
  `user_id` int(10) unsigned NOT NULL,  
  `code` varchar(255) COLLATE utf8_unicode_ci NOT NULL,  
  `completed` tinyint(1) NOT NULL DEFAULT '0',  
  `completed_at` timestamp NULL DEFAULT NULL,  
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',  
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',  
  PRIMARY KEY (`id`)  
 );  
 CREATE TABLE IF NOT EXISTS `persistences` (  
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  
  `user_id` int(10) unsigned NOT NULL,  
  `code` varchar(255) COLLATE utf8_unicode_ci NOT NULL,  
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',  
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',  
  PRIMARY KEY (`id`),  
  UNIQUE KEY `persistences_code_unique` (`code`)  
 );  
 CREATE TABLE IF NOT EXISTS `reminders` (  
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  
  `user_id` int(10) unsigned NOT NULL,  
  `code` varchar(255) COLLATE utf8_unicode_ci NOT NULL,  
  `completed` tinyint(1) NOT NULL DEFAULT '0',  
  `completed_at` timestamp NULL DEFAULT NULL,  
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',  
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',  
  PRIMARY KEY (`id`)  
 );  
 CREATE TABLE IF NOT EXISTS `roles` (  
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  
  `slug` varchar(255) COLLATE utf8_unicode_ci NOT NULL,  
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,  
  `permissions` text COLLATE utf8_unicode_ci,  
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',  
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',  
  PRIMARY KEY (`id`),  
  UNIQUE KEY `roles_slug_unique` (`slug`)  
 );  
 CREATE TABLE IF NOT EXISTS `role_users` (  
  `user_id` int(10) unsigned NOT NULL,  
  `role_id` int(10) unsigned NOT NULL,  
  `created_at` timestamp NULL DEFAULT NULL,  
  `updated_at` timestamp NULL DEFAULT NULL,  
  PRIMARY KEY (`user_id`,`role_id`)  
 );  
 CREATE TABLE IF NOT EXISTS `throttle` (  
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  
  `user_id` int(10) unsigned DEFAULT NULL,  
  `type` varchar(255) COLLATE utf8_unicode_ci NOT NULL,  
  `ip` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,  
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',  
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',  
  PRIMARY KEY (`id`),  
  KEY `throttle_user_id_index` (`user_id`)  
 );  
 CREATE TABLE IF NOT EXISTS `users` (  
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  
  `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,  
  `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,  
  `permissions` text COLLATE utf8_unicode_ci,  
  `last_login` timestamp NULL DEFAULT NULL,  
  `first_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,  
  `last_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,  
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',  
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',  
  PRIMARY KEY (`id`),  
  UNIQUE KEY `users_email_unique` (`email`)  
 );  


4.基本的な使い方

さあ、ではやっと実際の使い方です。
おそらくSentinelは直感的に使えると思います。

1.新規ユーザーの追加
 $credentials = [  
   'email'  => 'taro.yamada@example.com',  
   'password' => 'password',  
   'first_name' => '太郎',  // 省略可
   'last_name' => '山田'  // 省略可
 ];  
 $user = Sentinel::registerAndActivate($credentials);  
これだけでOK!
パスワードは自動的に暗号化されているのでセキュリティにも強くなっています。

  • 必要がない場合は「first_name」「last_name」は省略できます。
  •  「メール送信→URLをクリックで本登録」という流れにしたい場合は「6.アクティベーション」を参照してください。

2.ログイン
 $credentials = [  
   'email'  => 'taro.yamada@example.com',  
   'password' => 'password',  
 ];  
 $user = Sentinel::authenticate($credentials);  
もし次からのログインを省略する場合は以下のように第二引数に true をセットします。
 Sentinel::authenticate($credentials, true);   

3.ユーザーの取得

(1)IDから取得
 $user = Sentinel::findById(1);  
(2)メールアドレスから取得
 $credentials = [  
   'login' => 'taro.yamada@example.com',  
 ];  
 $user = Sentinel::findByCredentials($credentials);  
あとは、Persistence code  などからでもユーザーを取得できるようです。


4.ユーザー情報の変更/削除

変更は update() を使います。
 $user = Sentinel::findById(1);  
 $credentials = [  
   'email' => 'new.taro.yamada@example.com',  
   'password' => 'new_password',  
   'first_name' => '二郎',  
   'last_name' => '鈴木'  
 ];  
 $user = \Sentinel::update($user, $credentials);  
削除は delete() です。
 $user = Sentinel::findById(1);  
 $user->delete();  


5.役割の設定

Sentinel では、例えば
  • Aさん → 管理者
  •  Bさん → 一般ユーザー
というようにログインする人たちに役割を設定することができます。

(1)新しい役割を追加する
 $role = Sentinel::getRoleRepository()  
   ->createModel()  
   ->create([  
     'name' => '管理者',  
     'slug' => 'admin'  
  ]);  
(2)役割をユーザーに割り当てる/解除する
 $user = Sentinel::findById(1);  
 $role = Sentinel::findRoleByName('管理者');  
 $role->users()->attach($user);  // 割り当てる  
 $role->users()->detach($user);  // 割り当てを解除する  
(3)役割を取得
 $role = Sentinel::findRoleById(1);  // ID
 $role = Sentinel::findRoleBySlug('admin');  // Slug(ユニークIDみたいなもの)  
 $role = Sentinel::findRoleByName('管理者');  // 役割の名前

6.アクティベーション

サイトによっては、ユーザー登録をするときまず「本登録URL」をメール送信し、そのURLがクリックされた時点で本登録するという流れが必要な場合があると思います。
アクティベーションはこの機能を実現するため利用できます。

(1)本登録コードの取得
 $user = \Sentinel::register([  
   'email'  => $email,  
   'password' => 'password'  
 ]);  
 $activation = \Activation::create($user);  
 $activation_code = $activation->code;  
$activation_code に本登録に必要なコードが入っていますので、このコードを使って
http://example.com/activation/****************************************
のような本登録のURLを作成することができます。

(2)本登録を実行
 $user = Sentinel::findById(1);  
 if (Activation::complete($user, '本登録コード'))  
 {  
   // 本登録完了!
 }  
 else  
 {  
   // 失敗,,,
 }  
※ちなみに本登録していない状態でログインを試みると「NotActivatedException」エラーが帰ってきます。


7.パスワード・リマインダー

ユーザーがパスワードを忘れたときに利用する再発行の機能です。

(1)リマインダー・コードを取得する
 $user = \Sentinel::findById(1);  
 $reminder = \Reminder::create($user);  
 $reminder_code = $reminder->code;  
(2)新パスワードの設定
 $user = Sentinel::findById(1);  
 if ($reminder = Reminder::complete($user, 'リマインダー・コード', '新パスワード'))  
 {  
   // 成功!
 }  
 else  
 {  
   // 失敗,,,
 }  

ということで少し長くなってしまいましたが、Sentinelの主な機能は以上です。他にもまだいくつか機能がありますが、それはまたの機会ということで ^-^
ではでは〜。



Thank you, Cartalyst.
Sentinel is a great package!

0 件のコメント:

コメントを投稿