Help us understand the problem. What is going on with this article?

10分でLaravelにログイン認証を追加する手順

はじめに

LaravelのWebアプリに10分で認証機能を追加します。
予めLaravelプロジェクトやSQLite3が用意できていれば、10分もかからず3分でもできるかもしれません。。。
それくらい簡単!

Laravel公式ガイド

Laravel公式ガイドの認証に関する情報は以下のページにあります。
ざっくり手を動かしてみたら、一読することをオススメします。

Laravel 5.7 認証

ログイン認証機能の追加手順

Laravelプロジェクトがまだ無い状態を想定して、プロジェクト作成から進めます。

デモ用のLaravelプロジェクトを作成

Laravelプロジェクトを作成

composer create-project laravel/laravel=5.7 laravel_auth_demo

SQLiteデータベースファイル作成

touch database/database.sqlite

LaravelプロジェクトのDB接続情報を変更

viで設定ファイルを開きます。

vi .env

以下の記述を、

.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

以下のように書き換えます。

.env
DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=homestead
# DB_USERNAME=homestead
# DB_PASSWORD=secret

ここまでの動作確認

以下のコマンドでテスト用サーバを起動します。

php artisan serve

Laravelと表示されることを確認してください。

Laravelプロジェクトに認証機能を追加

認証用のビューを追加

Ctrl+Cで開発サーバを停止し、以下のコマンドを実行します。

php artisan make:auth

Authentication scaffolding generated successfully.というメッセージが表示されれば成功です。
以下のファイルが新たに作成されており、web.phpも認証用に書き換えられています。

  • auth/login.blade.php
  • auth/register.blade.php
  • auth/verify.blade.php
  • auth/passwords/email.blade.php
  • auth/passwords/reset.blade.php
  • layouts/app.blade.php
  • home.blade.php

認証用のテーブルを作成

以下のコマンドを実行します。

php artisan migrate

Migration table created successfully.というメッセージが表示されれば成功です。
sqlite3でdatabase/database.sqliteを開いて、テーブルが作成されているか確認してください。

sqlite3 database/database.sqlite
SQLite version 3.28.0 2019-04-15 14:49:49
Enter ".help" for usage hints.
sqlite> .table
migrations       password_resets  users          

ここまでの動作確認

以下のコマンドでテスト用サーバを起動します。

php artisan serve

アカウント登録

http://127.0.0.1:8000/registerを開いて、アカウント登録画面が表示されることを確認してください。

image.png

アカウントを登録したら、Dashboardというページが表示されます。
右上のユーザアカウント名のセレクトボックスからLogoutを選択してログアウトしてみてください、

image.png

ログイン

http://127.0.0.1:8000/loginを開いて、ログイン画面が表示されることを確認してください。

image.png

先ほど作成したユーザ情報でログインできることを確認してください。
※パスワードのリセット機能は、サーバからメールを送信する機能を実装しないと動作しません

ここまでで、Laravelにログイン認証機能を追加する対応は完了です。

ルートの保護を行う

この時点では、まだユーザの登録・ログインができるだけなので、どのビューに対してもログインによる保護がかかっていない状態(ログインしていなくてもアクセスできてしまう状態)です。
そのため、ルートの保護を設定してログインしていないと見れないページを作成してみます。

確認用のテストページを追加

ビューファイルを作成します。

touch /resources/views/test.blade.php

以下のような内容で保存しておきます。

test.blade.php
<h1>テストページ</h1>                                                                                              
<p>このページはログインしているユーザにしか見せたくない。。。</p>

テストページへのルーティングを設定

web.phpを開きます。

vi /routes/web.php

テストページへのルーティングを設定します。

web.php
<?php                                                                                                              

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});
Route::get('/test', function() {  // 追加
    return view('test'); // 追加
}); // 追加

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

動作確認

http://127.0.0.1:8000/testへアクセスしてみます。

image.png

まだ保護していないので、ログインしていないのにページが見えちゃいますね。。。

ルートの保護を行う

web.phpを再度開きます。

vi /routes/web.php

以下の設定を追加します。これがルートの保護に関する設定です。
たったこれだけでログインしていないとアクセスできないルーティングになります。

web.php
<?php                                                                                                              

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});
Route::get('/test', function() {
    return view('test');
})->middleware('auth'); // 修正

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

改めて動作確認

http://127.0.0.1:8000/testへアクセスしてみます。

image.png

ルートの保護がされているビューをログインしていない状態で表示しようとすると、ログインページへリダイレクトされます。
続けてログインすると、もともと見ようとしていたビューを表示してくれます。

image.png

まとめ

10分でLaravelプロジェクトにログイン認証機能を追加できましたでしょうか?
慣れれば10分と言わず、3分もかからずに追加できるほど簡単ですね。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away