サイトアイコン 上尾市のWEBプログラマーによるブログ

「PHPフレームワーク Laravel Webアプリケーション開発」の感想・備忘録8

認証

認証を支えるクラス

以下の3つのインターフェースとそれらを実装したクラスが用意されている。

認証を支えるメソッド

Illuminate\Contracts\Auth\UserProviderインターフェースで定義されているメソッド。

上記のメソッドの引数または戻り値はIlluminate\Contracts\Auth\Authenticatableインターフェースを実装したクラスである。

Illuminate\Contracts\Auth\Authenticatableインターフェースで定義されているメソッド。

認証処理でユーザー情報へアクセスする際に利用されている。

データベースとセッションによる認証

デフォルトでは、Illuminate\Contracts\Auth\Authenticatableインターフェースを実装したIlluminate\Auth\GenericUser、およびセッション情報を元に認証情報へアクセスするためのIlluminate\Auth\SessionGuardをそのまま利用することができる。
※ Illuminate\Auth\GenericUserはデフォルトのuserテーブルに対応している。

config/auth.phpに利用するguardとproviderを設定する。

認可

2種類ある。

どちらもApp\Provider\AuthServiceProviderに記述して利用する。

Gate

1. app/Providers/AuthServiceProviderに認可を定義。

use Illuminate\Contracts\Auth\Access\Gate;
// 〜省略〜
public function boot(Gate $gate)
{
    $this->registerPolicies();

    $gate->define('user-access', function(\App\User $user, $id) {
        return intval($user->getAuthIdentifier()) === intval($id);
    });
}

これをコントローラ、ミドルウェア、テンプレートなどで利用する。

2. 認可の適用 (コントローラの場合)

use Illuminate\Auth\AuthManager;
use Illuminate\Contracts\Auth\Access\Gate;
// 〜省略〜
private $authManager;
private $gate;

public function __construct(AuthManager $authManager, Gate $gate)
{
    $this->authManager = $authManager;
    $this->gate = $gate;
}
public function __invoke(string $id)
{
    if ($this->gate->allows('user-access', $id)) {
        // 認可されている場合の処理
    }
}

Policy

認可処理をまとめて記述する仕組み。

1. ポリシークラスの生成

php artisan make:policy XxxPolicy

モデルを指定する場合は、--model=Xxxを付ける。
(モデルを引数で受け取るメソッドも同時に生成される)
php artisan make:policy BookPolicy --model=Book

2. ポリシークラスの登録

App\Providers\AuthServiceProviderの$policies配列に追加する。
キーにモデル、値にポリシークラスのフルパスを指定する。

protected $policies = [
    'App\Book' => 'App\Policies\BookPolicy',
];

3. 認可の適用

canメソッド
$user =\Auth::user();
if ($user->can('view', $book)) {
    echo '認可されています。(can)<br>';
} else {
    echo '認可されていません。(can)<br>';
}
authorizeメソッド
$this->authorize('view', $book);
echo '認可されています。';
bladeでの認可の適用

@can〜@canelse〜@endcanディレクティブを使用する。

@can('view', $book)
{{-- viewが認可されている場合 --}}
@elsecan('create', \App\Book)
{{-- createが認可されている場合 --}}
@endcan
モバイルバージョンを終了