64
57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravelの認証の仕組み

Last updated at Posted at 2019-04-21

Laravelの認証

Laravelでは、プロジェクトディレクトリで下記のコマンドを打つと、スカフォールドで基本的な認証画面の作成ルーティングの設定を行ってくれます。

$ php artisan make:auth 

認証の仕組み

認証はミドルウェアを使って実現しています。
ミドルウェアとはOSとアプリケーションの間に入って処理を行ってくれるものです。
リクエスト時やレスポンス時にフィルタリングを行うなどしてくれます。
ログインの認証では、web,guest,authの3つのミドルウェアを使用しています。

認証前

認証前.png

認証後

認証後.png

参考:
Laravelの認証について
認証 5.5 Laravel

認証と認可の違い

一言で説明すると、
認証(Authentication)は、そのユーザが誰かを判断すること
認可(Authorization)は、そのユーザで何ができるかを判断すること
です。

認証と認可.png

参考:よくわかる認証と認可 | DevelopersIO

環境

Laravel 5.5.45
Homestead 8.2.0
Vagrant 2.2.4
Virtual Box 7.2.1

実際の中身

実際の中身を見ていきます。

作成される認証画面

スクリーンショット 2019-04-21 12.32.11.png
resources/viewsにログイン画面、登録画面、パスワードリセットの画面、ホーム画面などが生成されています。

設定されるルーティング

$ php artisan route:listを実行してルーティングを確認します。
スクリーンショット 2019-04-21 9.33.12.png
ここでMiddlewareのカラムに注目すると、それぞれ
ログイン前はweb,guestのミドルウェア
ログイン後はweb,authのミドルウェア
を使用していることがわかります。

ミドルウェアについて

ミドルウェアの定義

app/Http/Kernel.phpでミドルウェアの定義をしています。
ファイル名であるカーネルとはOSの中核部分の処理を行ってくれるものです。
このファイルでは3つの変数があります。

  • $middleware ・・・全ての処理に共通して処理を行うミドルウェアを定義します。各ルートを呼ばれたときに実行されます。
  • $middlewareGroups・・・複数のミドルウェアをグループとして定義します。
  • $routeMiddleware・・・ 単体で使うミドルウェアをキーと共に定義します。

認証に使用するweb, guest, authを以下に抜粋します。

app/Http/Kernel.php
   protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
   ]

    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    ];

クラスの中身を見てみます。F12キーで定義ファイルへジャンプできます。
ミドルウェアでは、handle関数に処理をするプログラムを記載し、nextでアプリケーションを次に進めます。

ミドルウェアの中身の説明について、こちらの記事から引用させていただきます。
[Laravel]ミドルウェアを整理してLaravelを軽くする - Qiita

webの中身

\App\Http\Middleware\EncryptCookies::class
Cookie の暗号化/復号化処理を行う機能
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class
指定された Cookie を Response ヘッダに登録する機能
\Illuminate\Session\Middleware\StartSession::class
Session の生成や取得などを行う機能
\Illuminate\View\Middleware\ShareErrorsFromSession::class
Session に保存されたエラー情報を View にセットする機能
\App\Http\Middleware\VerifyCsrfToken::class
CSRF を防ぐためのトークンの発行やチェックを行う機能
\Illuminate\Routing\Middleware\SubstituteBindings::class
Route Model Binding を実行する機能(Laravel5.3から追加)

authの中身

auth(\Illuminate\Auth\Middleware\Authenticate::class)
特定のルートへのアクセスに対してユーザー認証を行う機能

guestの中身

guest(\App\Http\Middleware\RedirectIfAuthenticated::class)
認証済かチェックし、認証済であれば /home にリダイレクトする機能

ミドルウェアの使用

ミドルウェアの使用方法には主に二つやり方があります。
(1)ルータでミドルウェアを使用する
(2)コントローラでミドルウェアを使用する

webのミドルウェアはroutes/web.phpのルートに対して使用されています。

app/Providers/RouteServiceProvider.php
class RouteServiceProvider extends ServiceProvider
{
    protected function mapWebRoutes()
    {
        Route::middleware('web')
             ->namespace($this->namespace)
             ->group(base_path('routes/web.php'));
    }
}

guestやauthのミドルウェアは、各コントローラのコンストラクタで使用されています。

app/Http/Controllers/HomeController.php
class HomeController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }
}
app/Http/Controllers/Auth/LoginController.php
class LoginController extends Controller
{
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }
}

参考:ミドルウェアについて - Laravel学習帳

認証・認可のカスタマイズ

Laravelでは、デフォルトでconfig/auth.phpに認証の設定がされています。

マルチ認証など独自の認証のカスタマイズをしたい場合は、Guard(ガード)やProvier(プロパイダ)、
認可のカスタマイズをしたい場合は、Gate(ゲート)やPolicy(ポリシー)あたりを自分で設定する必要があります。

参考:
認証 5.5 Laravel
認可 5.5 Laravel

最後に

記事に間違いや不明な点があれば遠慮なくご指摘ください。
私も勉強中の身なので、不足があればいろいろ教えてもらえたら嬉しいです。
ちなみにTwitterで認可と認証の違いがわからんって呟いたら教えてもらいました。笑

シュプレさんありがとうございます!

64
57
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
64
57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?