WEBプログラミング入門

Sentinelでユーザー管理機能を実装する

Sentinelをインストール

composerのpathが通っていることを確認

環境変数

バージョン確認

terminal
$ composer -V
Composer version 1.10.1 2020-03-13 20:34:27

インストール

公式マニュアル

Sentinel最新バージョンは5.XでPHP7.3以上であることが必要。

Sentinel本体をインストール

ライブラリのインストール先はドキュメントルートより上の階層とする。

terminal
//プロジェクトルートにsentinelをインストール
$ cd /c/xampp/htdocs/test1.com
$ composer require cartalyst/sentinel "^5.0"

依存関係をインストール

今回はフレームワーク(Laravel)を使わないため、必要な追加ライブラリをインストールする。
terminal
//依存ライブラリを追加インストール
$ cd /c/xampp/htdocs/test1.com
$ composer require illuminate/databaseilluminate/eventssymfony/http-foundation

インストール確認

インストール後は、/vendor/ライブラリファイル、/composer.json、/composer.lockができる。composer.jsonはパッケージを定義するファイル。

C:\xampp\htdocs\test1.com\composer.json
"require": {
  "cartalyst/sentinel": "^5.0",
  "illuminate/database": "^8.9",
  "illuminate/events": "^8.9",
  "symfony/http-foundation": "^5.1"
}

データベース作成

/vendor/cartalyst/sentinel/schema/README.mdを見ると、ライブラリを使わず手動でインストールした場合はmysql-5.6+.sqlをforkするように書いてあるので、これを使って基礎となるDBを作成する。mysql.sqlはphp5.5以下のものなので使わない。

ターミナルでの一連の操作

DB名は任意のため、認証を意味する「auth」というDBで作成する。追加ユーザーは説明のためパスワードを簡単なものにしているが本番環境では推測されないパスワードにする。

terminal
//MariaDBにログイン
$ mysql -u root -p
Enter password: *****
//データベース削除(authというDBがあれば削除)
MariaDB [(none)]> DROP DATABASE IF EXISTS auth;
//データベース作成(authというDBがなければ作成)
MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS auth CHARACTER SET=utf8;
//auth用のユーザー作成(例testuserというユーザー名でパスワードはpass)
MariaDB [(none)]> CREATE USER testuser@localhost identified by 'pass';
//testuserにDB(auth)に関するすべての権限を与える
MariaDB [(none)]> GRANT ALL ON auth.* to testuser@localhost;
//ログアウトして再ログイン
MariaDB [(none)]> exit
MariaDB [(none)]> mysql -u testuser -p
Enter password: *******
//操作対象のDBを選択
MariaDB [(none)]> use auth;
//スクリプトファイルを実行(mysql-5.6+.sql)
MariaDB [auth]> source C:\xampp\htdocs\test1.com\vendor\cartalyst\sentinel\schema\mysql-5.6+.sql
//確認(下記テーブルが作成されていればOK)
MariaDB [auth]> show tables;
+----------------+
| Tables_in_auth |
+----------------+
| activations    |
| persistences   |
| reminders      |
| role_users     |
| roles          |
| throttle       |
| users          |
+----------------+

使い方

ディレクトリ構成の例

一般的にはライブラリや設定ファイルは公開ディレクトリより上の階層に配置するため、例として下記の構成とする。

  • /home/ユーザー名/ドメイン名/public_htm/ 公開ディレクトリ
  • /home/ユーザー名/ドメイン名/vendor/ composerのライブラリ
  • /home/ユーザー名/ドメイン名/config/ 設定ファイル

DB接続ファイル

マニュアルを参考にデータベース操作部分は別ファイルに作成する。最後の行の$capsuleにはobject(Illuminate\Database\Capsule\Manager)が格納される。

プロジェクトルート/config/sentinel.php
<?php
use Illuminate\Database\Capsule\Manager as Capsule;
require_once dirname($_SERVER['DOCUMENT_ROOT']).'/vendor/autoload.php';
$capsule = new Capsule;
$capsule->addConnection([
  'driver' => 'mysql',
  'host' => 'localhost',
  'database' => 'auth',
  'username' => 'testuser',
  'password' => 'pass',
  'charset' => 'utf8',
  'collation' => 'utf8_unicode_ci',
]);
$capsule->bootEloquent();

Sentinelの設定ファイル

Sentinel自体の設定ファイルは\vendor\cartalyst\sentinel\src\config\config.phpにある。ロックされるまでのログイン試行回数やロックする時間などが設定できる。

必要な機能

  1. 新規登録
  2. ログイン
  3. ログアウト
  4. ユーザー変更
  5. ユーザー削除
  6. パスワードを忘れた時の再発行
/login.php
<?php
//DOCUMENT_ROOTの上の階層/config/sentinel.phpを読み込む
require_once dirname($_SERVER['DOCUMENT_ROOT']).'/config/sentinel.php';
use Cartalyst\Sentinel\Native\Facades\Sentinel;
//トークン作成例(CSRF対策)
session_start();
$_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32));
//ログインしているならユーザー情報を変数に格納。Sentinel::checkとは
if($user_info = Sentinel::check()){
//メールアドレスの@より前部分を切り出して「さんログイン中」と表示
  echo substr($user_info['email'],0,strpos($user_info['email'],'@')),"さんログイン中";
?>
//ここに書く処理はログインしている状態のため、ログアウトか会員削除処理を記述
<form action="logout.php" method="post">
<input type="hidden" name="token" value="<?=$_SESSION['token']?>">
<input type="submit" value="ログアウト">
関連リンク