今回から3記事に渡ってLaravelの認証の基本について解説します。 Laravelの認証機能の作成は、別のライブラリをcomposerでインストールし、コマンドを実行するだけで簡単に実装できますが、それだけだと応用が効かなくなってしまい、認証についての理解も深まらないため、3記事に渡りLaravelでの認証機能について説明します。 認証についてはこちらへ。

Laravelの認証の概要

3年以内に更新されました。情報が古い可能性があります。
更新日 : 2020年02月05日

今回から3記事に渡ってLaravelの認証の基本について解説します。

Laravelの認証機能の作成は、別のライブラリをcomposerでインストールし、コマンドを実行するだけで簡単に実装できますが、それだけだと応用が効かなくなってしまい、認証についての理解も深まらないため、3記事に渡りLaravelでの認証機能について説明します。

認証についてはこちらへ。

Laravelの認証の仕組み

Laravelには認証機能を簡単に実装するコマンドやテーブルスキーマ(データベースのテーブル定義)が用意されています。

Laravelで用意されている特定のコマンドを実行するだけで一通りの認証機能が一瞬で完成しますが、どのような動作で認証されているのかを把握しておかないと自前の認証機能を作りたい場合に対応できません。

この記事ではLaravelでの認証の仕組みを応用ができる範囲まで解説し、残り2つの記事で実際の認証機能の作成と認証機能の応用を行っていきます。

Laravelで実装されている認証ガードとプロバイダ

認証の基本は「認証とは」で書いた記事の仕組みと同様です。その他ハッシュ化ソルトも利用しています。そのうえでLaravelでは認証機能の拡張がしやすいように2つの基本的な概念があります。

1. ガード

そのうちの1つがガードと呼ばれるものです。

ガードはLaravelの認証において、URLごとにどのような認証を行うかを決定します。つまり、セッションで認証を行うのか・トークンで認証を行うのかを決定します。

セッションはWEBアプリケーションにおいてよく使われる一般的な認証方法です。セッションについてはこちらの記事を読めばわかりますが、認証情報を保持しておく方法です。

トークンはスマートフォンアプリとのやり取りや外部WEBサービスとの連携などで利用される認証方法です。認証を通ったクライアントに対して認証されたことを示すトークン(許可証)をクライアントに渡し、クライアントは認証情報が必要なURLにアクセスをする際にそのトークン情報を付与することで、必要な情報を取得することができます。

ガードではこの2種類を設定し、セッションで認証するのか・トークンで認証するのかを決めます。

2. プロバイダ

2つ目のLaravelの認証における基本的な概念がプロバイダです。プロバイダという概念自体は一般的なITの分野でもよく利用される概念ですが、Laravelの認証においてもあまり変わりはありません。

プロバイダ(Provider)は日本語に訳すと「提供者」です。つまりある情報の提供する側の機能をプロバイダと総称します。

Laravelにおけるプロバイダも同じです。ガードが認証方法を決めるのに対し、プロバイダはその認証情報をどこから・どのようにサーバーのデータベースから取得するかを決定します。つまり保存してある認証情報を提供する側の機能です。

LaravelにはデータベースへのアクセスとしてEloquentというORMを提供しています。

そのEloquentを利用してデータベースから情報を取得するか、あるいはLaravelが用意しているクエリビルダ1(SQLを発行・実行する機能)を利用して情報を取得するかをプロバイダに指定します。

実際に認証の設定ファイルを見てみる

Laravelではデフォルトで認証機能を簡単に実装する機能が備わっています。そのためガードとプロバイダのデフォルトの設定を見ることができます。

まずはデフォルトの設定を見て、プロバイダとガードをどのように設定しているのかを見ていきましょう。

config/auth.phpを見てデフォルトの設定を確認

Laravelのプロジェクトフォルダ内にconfig/auth.phpというファイルを見て確認していきます。

<?php
return [
    /*
    |--------------------------------------------------------------------------
    | Authentication Defaults
    |--------------------------------------------------------------------------
    |
    | This option controls the default authentication "guard" and password
    | reset options for your application. You may change these defaults
    | as required, but they're a perfect start for most applications.
    |
    */
    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
    /*
    |--------------------------------------------------------------------------
    | Authentication Guards
    |--------------------------------------------------------------------------
    |
    | Next, you may define every authentication guard for your application.
    | Of course, a great default configuration has been defined for you
    | here which uses session storage and the Eloquent user provider.
    |
    | All authentication drivers have a user provider. This defines how the
    | users are actually retrieved out of your database or other storage
    | mechanisms used by this application to persist your user's data.
    |
    | Supported: "session", "token"
    |
    */
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],
    ],
    /*
    |--------------------------------------------------------------------------
    | User Providers
    |--------------------------------------------------------------------------
    |
    | All authentication drivers have a user provider. This defines how the
    | users are actually retrieved out of your database or other storage
    | mechanisms used by this application to persist your user's data.
    |
    | If you have multiple user tables or models you may configure multiple
    | sources which represent each model / table. These sources may then
    | be assigned to any extra authentication guards you have defined.
    |
    | Supported: "database", "eloquent"
    |
    */
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],
    /*
    |--------------------------------------------------------------------------
    | Resetting Passwords
    |--------------------------------------------------------------------------
    |
    | You may specify multiple password reset configurations if you have more
    | than one user table or model in the application and you want to have
    | separate password reset settings based on the specific user types.
    |
    | The expire time is the number of minutes that the reset token should be
    | considered valid. This security feature keeps tokens short-lived so
    | they have less time to be guessed. You may change this as needed.
    |
    */
    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],
];

コメントが多く、長く見えるのでコード部分だけを抜き出してみます。

<?php
return [
    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],
    ],
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
    ],
    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],
];

ただの連想配列ですが、大事な部分(プロバイダとガードの設定)を見ていきます。

まず先にプロバイダを見ていきましょう。

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
]

上記を見るとプロバイダの設定が記載されています。

ここではプロバイダの設定値usersを設定しています。このキー名がプロバイダの名前になります。

キーであるusersの中身を見てみましょう。さらに連想配列となっています。キー名driverにはeloquentまたはdatabaseを設定します。
eloquentはEloquentを認証情報の取得で利用する設定、databaseはクエリビルダを利用する設定となっています。

さらにmodelというキー名では、認証情報に利用するクラスを指定しています。ここではApp\User::classということで、app/User.phpのクラスを利用する設定になっています。app/User.phpはMVCのモデルとしてEloquentで定義されているので、そのまま利用が可能です。

これがプロバイダの設定になります。

次にガードの設定を見てみましょう。

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => false,
    ],
],

ガードの設定はguardsキーの中で設定します。デフォルトではwebapiというガードが設定されています。これらのガードの設定値も具体的に見ていきましょう。

まずはwebです。キー名driverにはsessionが設定されています。driverにはsessionまたはtokenを設定します。

先程説明したとおり、セッションかトークンを利用して認証を行うことを示しています。

次にproviderです。これは先程設定を見たプロバイダのキー名を指定します。

プロバイダの名前をusersと設定していたため、そのプロバイダを利用してガードの認証処理を行うという設定です。

apiの設定ではdrivertokenを設定し、プロバイダはwebと同様にusersを指定しています。apiというガードの設定値でも同様のプロバイダを利用して認証情報にアクセスする設定です。

最後に一番上にあるdefaultsキーを見てみます。

'defaults' => [
    'guard' => 'web',
    'passwords' => 'users',
],

ここではデフォルトの認証処理をどのガードで行うかを設定します。実際に認証機能を実装するとわかりますが、実際に認証機能を利用する際に、どのガードを利用するかを指定します。ガードを指定することによって、例えば管理者用ページの認証なのかユーザー用のページの認証なのかを決めることができます。

どのガードを利用するかの設定を省略した際に利用されるのがdefaultsの設定です。defaultsでガードの指定をしておくことにより、デフォルト(指定しないで認証)で認証する際の設定を決めることができます。

ここではwebを指定しているため、ガードの設定値を見た際にあったwebのガードを利用することになっています。

まとめ

Laravelでの認証の概念を説明しました。

基本的にはconfig/auth.phpの設定を適切にするだけで、後はドキュメントに記載されたとおりに使いたいガードを指定して認証機能をコードとして書くだけで簡単に認証機能を作成することができます。

具体的な認証機能を実装するためのコードは次回以降の記事で解説していきます。

  1. Eloquentも内部ではクエリビルダを利用しています。 ↩︎