【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";
}
以上です。
ディスカッション
コメント一覧
まだ、コメントがありません