BackEnd

コードでわかるLaravelのブラウザ認証

投稿日:2020年11月30日 更新日:

はじめに

Laravel 8からは、認証機能のscaffoldとして、これまで推奨されていたLaravel UIの代わりに、Laravel Jetstreamが推奨されるようになりました(Laravel 8でも使用することはできます)。しかし、このLaravel Jetstreamが高機能で見た目が良いかわりに、細かなカスタマイズがしにくいことから、Laravel UIを採用するケースもあるようです。

認証機能の実装については、これらのライブラリを使用する他に、Laravelの認証クラスを直接使って、自前の認証機能を実装することもできます。

そこで、今回はLaravelのブラウザ認証クラスの処理の流れをコードを示しながら紹介します。

認証機能の概要

認証機能では、 guardprovider が重要な概念となります。

guard は、リクエスト毎にユーザーを認証する方法を定義しています。これには、セッションストレージとクッキーを使って状態を保持する SessionGuard と、トークンを使って認証する TokenGuard があります。

provider はデータベースなどの永続ストレージから、ユーザーを取得する方法を定義しています。これには、 Eloquent を使う EloquentUserProvider と、クエリビルダーを使う DatabaseUserProvider があります。

また、 guardprovider を自前で実装することもできます。

それでは、実際にコードを見てみましょう。

Controller

ログイン時、コントローラでは、 Auth ファサードの attempt() メソッドでユーザーを認証します。

Auth::attempt() に認証で使用するパラメータの配列を渡します。実際には、 SessionGuard クラスの attempt() メソッドが呼ばれます。

また、ログイン状態を維持したい場合は、 attempt() メソッドの第2引数に true を渡します。

なお、ユーザーを取得する条件は、例の通りである必要はありません。たとえば、 email の代わりに、 user_code などの何らかのユニークなカラムを指定することができます。さらに、 credentials['role'] = 1; などのように、追加の条件を付加することもできます。

Auth ファサードの guard() メソッドを使うと、使いたいguardインスタンスを指定することができます。これにより、異なる複数の認証処理を併用することができます。

SessionGuard

SessionGuard クラスでは、ユーザの認証、RememberTokenの更新、認証済みのユーザーインスタンスへのアクセスなどの機能を提供します。

SessionGuard クラスの attempt() メソッドを抜粋しました。順番に処理を見てきます。

fireAttemptEvent

初めに fireAttemptEvent() メソッドが呼ばれ、 Attempting イベントが発行されます。

retrieveByCredentials

ここでは、 auth.php で指定した UserProviderretrieveByCredentials() メソッドが呼ばれ、 Illuminate\Contracts\Auth\Authenticatable 、もしくは、 null が返却されます。

hasValidCredentials

ここでは、(1)渡された認証情報を検証し、(2)成功すればイベントを発行します。

login

ここでは、(1)セッションストレージのIDを更新し、 $remember がtrueかつ、RememberTokenが空の場合、(2)新しいRememberTokenを発行して、(3)クッキーが更新されます。その後、(4) Login イベントが発行されて、認証されたユーザーがセットされ、 Authenticated イベントが発行されます。

fireFailedEvent

hasValidCredentials() メソッドで検証に失敗した場合、 Failed イベントが発行されます

EloquentUserProvider

UserProvider は、データベースなどの永続ストレージからユーザーを取得する機能を提供します。

retrieveByCredentials

SessionGuard クラスの attempt() メソッドから呼ばれます。渡された credentials をもとにユーザーを取得し、 model を返却します。

(1)渡された credentials をチェックし、問題があれば null を返却します。(2)認証用の model を返却します。(3)認証のためのクエリを組み立てます。(4)最初に見つかったユーザーを返却します。

retrieveByToken

SessionGuard クラスの userFromRecaller メソッドから呼ばれます。渡されたユーザーを識別する値をもとにユーザーを取得し、そのユーザーのRememberTokenとユーザーを比較して、 model または null を返却します。

(1)認証用の model を返却します。(2)認証のためのクエリを組み立て、最初に見つかったユーザーを返却します。(3)ユーザーが見つからなければ null を返却します。(4)見つかったユーザーのRememberTokenを取得します。(5)渡されたRememberTokenとユーザーのRememberTokenを比較し、一致すればユーザーを、一致しなければ null を返却します。

DatabaseUserProvider

EloquentUserProvider と同じく、データベースなどの永続ストレージからユーザーを取得する機能を提供します。 EloquentUserProvider では、ユーザーの取得にEloquentを使っていましたが、こちらはクエリビルダーを使います。

retrieveByCredentials

SessionGuard クラスの attempt() メソッドから呼ばれます。渡された credentials をもとにユーザーを取得し、 model を返却します。

(1)渡された credentials をチェックし、問題があれば null を返却します。(2)認証のためのクエリを返却します。(3)認証のためのクエリを組み立てます。(4)最初に見つかったユーザーを返却します。(5)ユーザーを Illuminate\Auth\GenericUser に変換して返却します。

retrieveByToken

SessionGuard クラスの userFromRecaller メソッドから呼ばれます。渡されたユーザーを識別する値をもとにユーザーを取得し、そのユーザーのRememberTokenとユーザーを比較して、 model または null を返却します。

(1)認証のためのクエリを組み立て、最初に見つかったユーザーを返却します。(2)渡されたRememberTokenとユーザーのRememberTokenを比較し、一致すればユーザーを、一致しなければ null を返却します。

さいごに

Laravelのブラウザ認証の流れをコードを示しながら紹介しました。API認証の方も、似たような流れになっています。API認証に興味があれば、よければこちらの記事もご覧ください。

おすすめ書籍

PHPフレームワークLaravel入門 第2版 初めてのPHP

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

rails

半年ぶりにRails Tutorialをやったメモ

はじめに Railsを触り始めて半年ほどたちました、tonnyです。 復習もかねてRails Tutorialを実施したので、そのメモを残します。 やはり2回目でも気づくことは多いので、非常に勉強にな ...

laravel logo

Laravel Admin でCSVインポートを実装する

1 はじめに2 下準備2.1 Laravel Adminの導入2.2 Laravel Excelの導入3 Laravel Excelの実装3.1 Importクラスの作成3.2 モデルのfillabl ...

laravel logo

LaravelでHTTP通信

1 はじめに2 インストール3 基本的な使い方3.1 GETでリクエストを投げる3.2 リクエストヘッダーを指定3.3 クエリパラメータを指定3.4 timeout時間を指定3.5 POSTでリクエス ...

markdownで書けるドキュメントツールのGitbookを試す

1 はじめに2 Gitbookとは3 nvm4 node.jsインストール5 Gitbook導入5.1 インストール5.2 初期化5.3 ローカルでブラウザから確認6 作成と編集6.1 見出し編集7 ...

rails

RailsでAjax処理で画面を更新する

1 はじめに2 View(遷移元)の設定3 Controllerの実装4 View(遷移先)の実装5 参考6 さいごに はじめに RailsでAjax処理で画面を更新する方法を簡単に紹介します。 Vi ...

フォロー

blog-page_side_responsive

2020年11月
1234567
891011121314
15161718192021
22232425262728
2930  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。