読者です 読者をやめる 読者になる 読者になる

tanaka's Programming Memo

プログラミングについてのメモ。

PHPの認証ライブラリ Sentinel

認証に関する様々な機能を提供してくれるPHPのライブラリ、CARTALYSTの「SENTINEL」をmacのローカル環境で使ってみます。

概要

以下、公式サイトのINTRODUCTIONの意訳。

モダンでフレームワークを選ばないAuthorization(認可)やAuthentication(認証)のパッケージです。権限設定、独自のハッシュアルゴリズム、そして追加のセキュリティ機能を持ちます。

パッケージは、FIG(Framework Interop Group)によるPSR-4(PHP Standard Recommendations - Autoloading Standard)に対応しており、PHPコード間で柔軟な制御ができます。

動作環境はPHP 5.4以上が必要で、オプションとしてフレームワーク統合を単純化するために、Laravel 5 FacadeとサービスProviderがバンドルされています。

インストール

Composerを利用するのが最も簡単です。

macなど、Composerがグローバルにインストールされている場合は、ターミナルで組み込みたいプロジェクトフォルダーに移動して、以下でインストールできます。

composer require cartalyst/sentinel "^2.0"

レンタルサーバー上など、composer.pharをダウンロードして利用する場合は以下の通りです。すでにcomposer.pharをダウンロード済みであれば、2行目だけで大丈夫です。

curl -sS https://getcomposer.org/installer | php
php composer.phar require cartalyst/sentinel "^2.0"

vendor/autoload.php ファイルを require することで、パッケージが自動的に読み込まれます(自動的に読み込む機能がPSR-4によるものです)

Nativeで利用する

今回はSlimPHPと組み合わせたいので、Nativeでセットアップします。

Sentinelは illuminate/database など、幾つかのライブラリを利用します。それらをインストールします。

- vendor/cartalyst/sentinel/composer.json に開発用の設定があるので、それを参考にしました

{
    "require": {
        "cartalyst/sentinel": "^2.0",
        "cartalyst/support": "~1.0",
        "illuminate/database": "~5.0",
        "illuminate/events": "^5.2",
        "illuminate/http": "~5.0",
        "illuminate/support": "~5.0",
        "php": ">=5.4.0",
        "paragonie/random_compat": "~1.1"
    }
}
  • 上書き保存する
  • ターミナルのプロジェクトフォルダーから以下を実行して必要なコンポーネントをインストール
composer update

データベースの準備

Sentinel用のデータベースとテーブル、操作するユーザーを作成しましょう。

  • MySQLサーバーが起動していなければ以下で開始する
mysql.server start
  • ターミナルで、プロジェクトフォルダーから以下を実行
mysql -u データベースの作成権限のあるユーザー -p
  • パスワードの要求があるので入力
  • MySQLにログインしたら、以下でデータベースを作成
CREATE DATABASE IF NOT EXISTS sentinel CHARACTER SET=utf8;
  • 作成したデータベースを利用
use sentinel;
  • 設定を読み込む。以下は、MySQLのバージョンが5.6以上の場合。それ以前の場合は「mysql.sql」に差し替える
SOURCE ./vendor/cartalyst/sentinel/schema/mysql-5.6+.sql;
  • Sentinelを操作するためのユーザーを作成する。以下で、localhostのみ有効なsentineluserという名前のユーザーを作成する
CREATE USER 'sentineluser'@'localhost' IDENTIFIED BY '設定したいパスワード';
  • アクセス用のユーザーにデータベース上でテーブルの操作権限を与える
GRANT SELECT,DELETE,INSERT,UPDATE,CREATE ON sentinel.* TO 'sentineluser'@'localhost';
quit

テストコードを作成

動作テストをするためのコードを用意します。プロジェクト用のフォルダーにsrcフォルダーを作成して、その中に tuto.php というファイルを作成して、以下のコードを入力してください。

<?php
// Import the necessary classes
use Cartalyst\Sentinel\Native\Facades\Sentinel;
use Illuminate\Database\Capsule\Manager as Capsule;

// Include the composer autoload file
require __DIR__.'/../vendor/autoload.php';

// Setup a new Eloquent Capsule instance
$capsule = new Capsule;

$capsule->addConnection([
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'sentinel',      // データベース名を変更していたら合わせて変更
    'username'  => 'xxxx',          // xxxxを、データベースのユーザー名に変更
    'password'  => 'xxxxxx',        // xxxxxxを、データベースのパスワードに変更
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
]);

$capsule->bootEloquent();

// ユーザー情報
$credentials = [
    'email' => 'email@example.com',
    'password' => 'pass'
];

// 登録済みかを確認
$user = Sentinel::getUserRepository()->findByCredentials($credentials);
if (is_null($user)) {
    // 存在しない場合は、新規登録
    $user = Sentinel::register($credentials);
    print_r($user);
}
else {
    // 存在する場合は削除
    $user->delete();
    echo "user deleted".PHP_EOL;
}

?>
  • 16行目のusernameの'xxxx'と、17行目のpasswordの後ろの'xxxxxx'を、実際に作成したMySQLのユーザー名(今回は sentineluser )とパスワードに書き換える
  • メールのテストをする場合は、26行目と27行目のユーザー情報も変更する。今回のチュートリアルは変更しなくても動作する

以上が出来たら上書き保存をして、ターミナルから以下で実行します。

php ./src/tuto.php

初めて実行すると、ユーザーが未登録なので、指定のユーザーを登録して、登録情報を画面に表示します。

もう一度実行すると、ユーザーが存在するので、ユーザーを削除して、画面に「user deleted」と表示します。

何も表示されない場合は、データベースのユーザー名やパスワードが間違えている可能性があるので見直してください。

まとめ

以下をやりました。

  • Sentinelのインストール
  • Sentinel用のデータベースの準備
  • Sentinelを使ったユーザー登録と削除の動作チェック

あとは、公式ページの USAGE に掲載されているリファレンスやExampleを参照して、使いたい機能を利用しましょう。

参考URL