SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

人気のPHPフレームワークLaravelを習得しよう

Laravelの認証機能を理解しよう

人気のPHPフレームワークLaravelを習得しよう 第10回

  • X ポスト
  • このエントリーをはてなブックマークに追加

ログインチェックの利用

 スキャフォールディングを利用することで、認証部分はコーディングなしで実現できました。では、認証後の各リクエスト処理に、認証済みかどうかをチェックする機能を追加するにはどうすればいいのでしょうか。実は、これも専用のミドルウェアを利用すれば簡単にできます。以下、コードを交えて具体的に紹介していきましょう。

コントローラクラスの用意

 まず、コントローラクラスを用意しましょう。これは、リスト2の内容です。

[リスト2]app/Http/Controllers/Chap10Controller.php
<?php
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class Chap10Controller extends Controller
{
	public function helloWithAuth()
	{
		return view("chap10.helloWithAuth");
	}
}

 単に画面を遷移させたいだけですので、処理内容としては特筆すべきものはありません。

継承機能を利用したテンプレート

 ここで記述したhelloWithAuth()メソッドを実行させるURLを次のものとします。

 http://localhost/firstlaravel/public/chap10/helloWithAuth

 このリンクをホーム画面に追加します。そのホーム画面のテンプレートファイルはresources/views/home.blade.phpです。このファイルを開いてみると、HTMLファイルとして先頭にあるはずのDOCTYPE宣言がなく、次のコードから始まっています。

@extends('layouts.app')

 これは、Bladeの継承機能を利用したものです。

 画面を作成する場合、ヘッダー部分やナビゲーション部分、フッター部分などは各画面共通です。そのようなものを全てのテンプレートファイルに記述するのは非効率的です。そこで、共通部分を記述したテンプレートファイルを作成しておき、差分だけを各ファイルに記述する方法をとります。

 今回のスキャフォールディングで、この共通部分にあたるレイアウトテンプレートとして、resources/views/layouts/app.blade.phpが追加されています。このファイルを見ると、リスト3の部分が記述されています。

[リスト3]resources/views/layouts/app.blade.php
〜省略〜
		</nav>
		
		<main class="py-4">
			@yield('content')  // (1)
		</main>
	</div>
</body>
</html>

 この(1)の部分に差分として埋め込みたいテンプレートがある場合は、次のようなコードを記述します。

@extends("layouts.app")
@section("content")
 :
@endsection

 こう記述することで、この@section("content")と@endsectionに囲まれた部分を、リスト3の(1)に埋め込んだ画面が表示されます。ホーム画面のテンプレートファイルhome.blade.phpはこの仕組みを利用しています。

 では、このファイルにリンクを追記しましょう。これは、リスト4の(1)の部分です。

[リスト4]resources/views/home.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
	<div class="row justify-content-center">
		〜省略〜
	</div>
	<a href="/firstlaravel/public/chap10/helloWithAuth">第10回サンプルへ</a>  // (1)
</div>
@endsection

 追記が完了し、ホーム画面をリロードすると図6のように無事リンクが追加されています。

図6: リンクが追加されたホーム画面
図6: リンクが追加されたホーム画面

helloWithAuthで表示させるテンプレートの作成

 次に、helloWithAuthリクエストで利用するテンプレートファイルを作成しましょう。せっかくなので、前項で紹介したレイアウトテンプレートを利用して作成します。これはリスト5の内容です。

[リスト5]resources/views/chap10/helloWithAuth.blade.php
@extends("layouts.app")
@section("content")
<section>
	<p>無事認証を通過しました!</p>
	<ul>
		<li>{{Auth::user()->name}}</li>  // (1)
		<li>{{Auth::user()->email}}</li>  // (1)
	</ul>
</section>
@endsection

 helloWithAuthリクエストが実行されてこの画面が表示されるタイミングは必ずログイン後とし、認証済みかどうかのチェックを行うようにします。その方法は後述します。

 ここで紹介したいのは、(1)の部分です。認証済みの場合、認証されたユーザー情報をいつでも取り出せるようにLaravelが用意してくれています。それが、(1)の「Auth::user()」というメソッドです。このメソッドに続けて、取り出したいプロパティ(テーブルのカラムに対応)を指定するだけで、その内容を表示できます。(1)では、名前とメールアドレスを表示するようにしています。

認証チェックミドルウェア

 コントローラクラスとテンプレートができたので、helloWithAuthリクエストをルーティング登録しましょう。実は、このときにミドルウェアとして認証チェックを指定するだけで、そのリクエスト処理がログイン後のみに有効かどうかを自動的にチェックしてくれます。それはリスト6のコードです。

[リスト6]routes/web.php
〜省略〜
Route::get("/chap10/helloWithAuth", "Chap10Controller@helloWithAuth")->middleware("auth");

 ミドルウェアとして指定するのは、「auth」だけです。これだけで、そのリクエスト処理がログイン後、つまり認証済みのユーザーだけに許されたことを意味し、認証済みかどうかを自動チェックしてくれます。未認証の場合は、自動的にログイン画面に遷移します。

 リスト6の1行を追記した上で、動作確認しておきましょう。

 図6のリンクが追加されたホーム画面のリンクをクリックし、helloWithAuthリクエスト処理を実行してみましょう。図7の画面が表示されます。

図7: helloWithAuthリクエスト処理の結果表示された画面
図7: helloWithAuthリクエスト処理の結果表示された画面

 ログインユーザーの名前とメールアドレスが表示されていることも確認できます。これが、リスト5の(1)の部分です。

 さらに、[Laravel]リンクや[Logout]リンクなど、レイアウトテンプレート部分が無事表示されているのが確認できるでしょう。

 この[Logout]リンクをクリックしてください。図1の未ログイン状態のホーム画面が表示されます。この未ログイン状態のまま、ブラウザの戻るボタンやURLの直接入力などの方法で、helloWithAuthリクエスト処理を実行させてください。すぐに、図2のログイン画面へ遷移します。未ログイン状態では、helloWithAuthリクエスト処理が実行できないことがわかります。

 ここでリスト6の末尾の「->middleware("auth")」を削除したルーティング登録をしたとき、すなわち、helloWithAuthリクエスト処理が未ログイン状態でも実行できるようにした場合、helloWithAuthリクエスト処理を実行させると図8のエラー画面が表示されます。

図8: helloWithAuthリクエスト処理を実行しようとしてエラーになった画面
図8: helloWithAuthリクエスト処理を実行しようとしてエラーになった画面

 エラー内容から、テンプレートファイル上の「Auth::user()->name」が適切に処理できていないことを意味します。これは、逆にいえば、helloWithAuthリクエスト処理は実行されたことを意味します。

 このことから、ルーティング登録に「->middleware("auth")」を記述するだけで、ログイン状態のチェックからログイン画面への遷移まで自動で行ってくれることがわかると思います。

まとめ

 以上で、本連載は全て終了です。これまで全10回にわたりお付き合いいただき、ありがとうございました。この10回分の連載でLaravelの主要な機能は一通り紹介できたと思います。ただ、あくまで主要な機能をさらっと紹介したに過ぎず、Laravel自体はフルスタックフレームワークという呼び名の通り、細かい機能まで含めると、本当にさまざまなものが用意されています。そのような、この連載中で紹介しきれなかった機能を今後利用するにあたり、一番信用できる情報は、なんといっても公式ドキュメントです。このドキュメントを読んでいくにあたって、その基礎となるような力をこの連載で養っていただけたなら、これほど嬉しいことはありません。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
人気のPHPフレームワークLaravelを習得しよう連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook<個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/12920 2020/10/05 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング