【PHP】Sentinel(Native)の使用方法

この記事について

PHPでユーザー管理を行う有名なライブラリにSentinel(SENTINEL BY CARTALYST)があります。

マニュアルも存在しますが、あまり内容が充実しておらず、例えば「ある役割のユーザーをすべて取得したい」など複雑なことをやろうとすると、マニュアルのみではできず、なかなか苦労しました。

そこで、いくつか使用例についてまとめてみました。

なお、本記事ではバージョン5.1を使用しています。

使用準備

composerでインストールしたクラスのオートローダーからの読み込みと、作成したDBに接続する必要があります。以下都度必要になりますので、「prepare_sentinel.php」などとして、都度requireします。

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

  // 必要なクラスをインポート
  use Illuminate\Database\Capsule\Manager as Capsule;

  // Eloquent Capsule インスタンスを生成
  $capsule = new Capsule;
  $capsule->addConnection([
    'driver'  => 'mysql',
    'host'   => '{db_host名}',
    'database' => '{db名}',
    'username' => '{db_user名}',
    'password' => 'xxxxxx',
    'charset'  => 'utf8',
    'collation' => 'utf8_unicode_ci',
  ]);
  $capsule->bootEloquent();

役割(role)の作成

Sentinelでは役割(role)をユーザーに割り当てることができます。役割は事前に作成しておく必要があります。

役割は名前(name)と別名(slug)を持ちます。

例えば、名前がcommonで別名がCommonの役割を作成するコードは以下です。

require "prepare_sentinel.php";

use Cartalyst\Sentinel\Native\Facades\Sentinel;

$role = Sentinel::getRoleRepository()->createModel()->create([
  'name' => 'common',
  'slug' => 'Common',
]);

ユーザー作成

例)’shomin’というユーザーを作成し、’common’という役割(role)を付ける場合は以下の通りです。

require "prepare_sentinel.php";

use Cartalyst\Sentinel\Native\Facades\Sentinel;

$credentials = [
   'login' => "shomin"
];

//ユーザが存在するか確認します。
$user = Sentinel::findByCredentials($credentials);

if($user==null){ //存在しなかったとき
   $user = Sentinel::registerAndActivate($credentials);
   $role = Sentinel::findRoleByName('common'); //役割を名前で見つける
   $role->users()->attach($user); //
}

ユーザー削除

'shomin’というユーザーを削除する方法は以下の通りです。

require "prepare_sentinel.php";

use Cartalyst\Sentinel\Native\Facades\Sentinel;
$credentials = [
   'login' => "shomin"
];

//ユーザを取得します。
$user = Sentinel::findByCredentials($credentials);

//ユーザー削除
$user->delete();

パスワード変更

'shomin’というユーザーのパスワードを’passw0rd’に変更する例は以下の通りです。

require "prepare_sentinel.php";

use Cartalyst\Sentinel\Native\Facades\Sentinel;

$credentials = [
  'login' => 'shomin'
];

$user = Sentinel::findByCredentials($credentials); //ユーザの存在確認

if($user!=null){ //存在している
    $credentials['password'] = 'passw0rd';
    $user = Sentinel::update($user, $credentials);
}

ログイン(認証)

POSTされたemailとpasswordでログインする例は以下の通りです。

sentinelは同一IPからのログイン試行回数が一定数を超えると、認証でThrottlingExceptionを発出するため、そのハンドリングも加えています。

require "prepare_sentinel.php";

use Cartalyst\Sentinel\Native\Facades\Sentinel;

$user = $_POST['email'];
$password = $_POST['password'];

$credentials = [
    'email' => $user,
    'password' => $password
];

try{
  $user = Sentinel::authenticate($credentials, true);
} catch (ThrottlingException $e){
  echo "ログイン試行回数が制限回数を超えました。900秒待ち再度ログインを実行してください。";
  exit;
}

ログインユーザーの取得(ログインしているかの確認)

現在自分がログインしているユーザー名を取得する例です。また、これによりユーザーがログイン状態であるかの確認を行うことができます。

require "prepare_sentinel.php";
use Cartalyst\Sentinel\Native\Facades\Sentinel;

if($user = Sentinel::check()){
   echo $user["email"]."でログインしています。"
}else{
   echo "あなたはログインしていません。"
}

役割が割り当てられているか確認

上記ログイン時に同時に、’common’という役割が割り当てられているか確認するコードは以下です。

require "prepare_sentinel.php";
use Cartalyst\Sentinel\Native\Facades\Sentinel;

$expect_role="common";

if($user = Sentinel::check()){
   echo $user["email"]."でログインしています。"
   if(Sentinel::inRole($expect_role)){ //役割が割り当てられているか確認
      echo "\nこのユーザーは".$expect_role."ユーザーです。"
   }
}else{
   echo "あなたはログインしていません。"
}

役割を割り振られているユーザーを全て取得

“common"という役割を割り振られているユーザーを全て出力する例は以下です。

require "prepare_sentinel.php";
use Cartalyst\Sentinel\Native\Facades\Sentinel;

$role = Sentinel::findRoleBySlug('company');
$users = $role->users()->get();

foreach($users as $user){

   echo $user["email"]."\n";

}

以上です。