1. Home
  2. PHP
  3. Laravel
  4. Laravelの認証機能でログイン/ユーザ登録/パスワードリセットなどの管理画面を一撃構築する(基本&入門編)

Laravelの認証機能でログイン/ユーザ登録/パスワードリセットなどの管理画面を一撃構築する(基本&入門編)

  • 公開日
  • 更新日
  • カテゴリ:Laravel
  • タグ:PHP,Laravel
Laravelの認証機能でログイン/ユーザ登録/パスワードリセットなどの管理画面を一撃構築する(基本&入門編)

Laravel などの PHP フレームワークを使用して Web アプリケーションを構築する事の利点として、認証機能が一定のセキュリティを担保しつつかつ簡単に実装できる点が挙げられます。

「一定のセキュリティ」というのは、フレームワークを使わずにログイン機能を実装する場合、インジェクション攻撃や CSRF(クロスサイトリクエストフォージェリ)などの対策を自分で実装しなければなりませんが、Laravel の認証機能ではその辺の機能が既に実装されているので、その分漏れがなく一定程度安全に、かつスピーディーにログイン機能が構築できる。という事になります。

という事で今回は、Laravel の認証機能にてログイン機能を持たせ、管理画面を構築してみたいと思います。

Contents

  1. 開発環境について
  2. Laravel の認証機能について
  3. データベースの作成
  4. 環境変数ファイルへの記述
  5. マイグレーション実行
  6. 認証機能を生成する
  7. パスワードリセット
  8. 動作確認
    1. ユーザ登録
    2. ログイン
    3. パスワードリセット

開発環境について

今回の開発環境は以下の通りです。

  • Linux CentOS 7
  • Apache 2.4
  • MySQL 5.8
  • PHP 7.2/7.1

Laravel のバージョンに関しては 5.8/5.7/5.6/5.5/5.4/5.3 にて動作確認済みです。

また、Laravel のルートディレクトリを「laravel/」とします。

Laravel の認証機能について

まず、Laravel の認証機能には「ログイン」「ユーザ登録」「パスワードリセット」の3つがあります。今回の作業でこの3つの機能を構築する事が出来ます。それぞれの実装を行わなくても一度にこれらの機能が構築できるので、これからその作業を行っていきます。

データベースの作成

言うまでもありませんが、ログインを行うという事はユーザの管理が必要であり、データベースを用いるのでまずはそれを作成します。

と言っても、詳細はマイグレーション で構築してしまいますので、今回はスキーマのみを作成します。

mysql にログインし、sample スキーマを作成します。 CUI で行いますが、XAMPP などを使っている場合は phpMyAdmin を使ってください。

# sample スキーマを作成
mysql> create database sample;
Query OK, 1 row affected (0.02 sec)

# 確認
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample             |
| sys                |
+--------------------+

環境変数ファイルへの記述

作成が完了したら、Laravel の env ファイルにデータベースの設定を記述しておきます。

laravel/.env を開いて、以下のデータベース情報(スキーマ名・ユーザ・パスワード)を記述します。

DB_DATABASE=sample
DB_USERNAME=your_username
DB_PASSWORD=your_password

マイグレーション実行

次に、マイグレーションを実行し、データベース内に、認証機能に必要なテーブルを作成します。

laravel ルートディレクトリへ移動し、以下の artisan コマンドを叩きます。

# laravel ルートディレクトリへ移動
cd /path/to/laravel

# artisan コマンドでマイグレーションを実行する
php artisan migrate

# 実行結果
[demo@localhost laravel]$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table

マイグレーションの実行が完了したら、データベース内のデーブルを確認します。

# sample スキーマ内のテーブルを確認
mysql> show tables;
+------------------+
| Tables_in_sample |
+------------------+
| migrations       |
| password_resets  |
| users            |
+------------------+

「migrations 」「password_resets 」「users 」3つのテーブルが生成されています。それぞれテーブル名そのままの意味ですが、マイグレーションを管理するテーブル、パスワードリセットを管理するテーブル、そして、ユーザを管理するテーブルになります。

# マイグレーションの管理テーブル
mysql> show columns from migrations;
+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| id        | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| migration | varchar(255)     | NO   |     | NULL    |                |
| batch     | int(11)          | NO   |     | NULL    |                |
+-----------+------------------+------+-----+---------+----------------+

# パスワードリセットの管理テーブル
mysql> show columns from password_resets;
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| email      | varchar(255) | NO   | MUL | NULL    |       |
| token      | varchar(255) | NO   |     | NULL    |       |
| created_at | timestamp    | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+

# ユーザの管理テーブル
mysql> show columns from users;
+----------------+------------------+------+-----+---------+----------------+
| Field          | Type             | Null | Key | Default | Extra          |
+----------------+------------------+------+-----+---------+----------------+
| id             | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name           | varchar(255)     | NO   |     | NULL    |                |
| email          | varchar(255)     | NO   | UNI | NULL    |                |
| password       | varchar(255)     | NO   |     | NULL    |                |
| remember_token | varchar(100)     | YES  |     | NULL    |                |
| created_at     | timestamp        | YES  |     | NULL    |                |
| updated_at     | timestamp        | YES  |     | NULL    |                |
+----------------+------------------+------+-----+---------+----------------+

認証機能を生成する

ここから Laravel 側の機能実装を行いますが、認証に必要となるルート定義やビューなどすべてを1つのコマンドで用意できます。

laravel ルートディレクトリへ移動し、以下の artisan コマンドを叩きます。

# laravel ルートディレクトリへ移動
cd /path/to/laravel

# artisan コマンドで認証に必要となるルート定義とビューを生成する
php artisan make:auth

# 実行結果
[demo@localhost laravel]$ php artisan make:auth
Authentication scaffolding generated successfully.

これで認証機能に必要なビュー、コントローラが生成され、その他ルート定義などの必要な依存の設定も行われます。

routes/web.php に追加されたコード

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');
生成された HomeController.php
laravel
├─ app
│   ├─ Http
│   │   ├── Controllers
│   │   │   ├── Auth
│   │   │   ├── Controller.php
│   │   │   ├── HomeController.php
HomeController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('home');
    }
}

これで認証機能の実装は完了です。

パスワードリセット

認証機能の大体は artisan コマンド一発で生成が完了しますが一点だけ、パスワードリセットの際にメール送信を行うので、メールサーバの設定が必要になります。

env ファイルに環境変数としてメールサーバの情報を記述しておきます。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

尚、今回は SMTP サーバから送信しますが、別の送信方法で設定する場合は
Laravel の mailable クラスでメール送信を行う
を参考に設定してください。(メールサーバ、アカウントを持っていない場合でも PHP関数で送信する方法も紹介しています。)

ここを設定しておかないと、パスワードリセット時にエラーになるので予め設定しておきましょう。

動作確認

それでは一通りの動作確認を行っていきます。

ユーザ登録

ログインする為のユーザを作成します。
http://YOURDOMAIN/register
にアクセスすると、ユーザ登録画面が表示されるので、入力してユーザを登録します。

登録が完了すると、ログイン後画面へ遷移するので、ユーザ登録機能の動作確認は完了です。

右上に表示されているユーザ名をクリックするとログアウトのリンクが表示されるので、一旦ログアウトします。

ログイン

次に、ログイン機能の動作確認を行います。
http://YOURDOMAIN/login
にアクセスすると、ログイン画面が表示されるので、入力してログインを行います。

ログインが成功すると、ログイン後画面へ遷移します。

これでログイン機能の動作確認は完了です。

パスワードリセット

最後に、パスワードリセットの動作確認を行います。

ログイン画面にある Forgot Your Password? のアンカーリンクをクリックするか、http://YOURDOMAIN/password/reset にアクセスするとパスワードリセット画面に遷移するので、登録ユーザのメールアドレスを入力して、Send Password Reset Link ボタンを押下します。

「パスワードリセットリンクが電子メールで送信されました」
と表示されれば、メールアドレス宛にリセットメールが送信されます。

メールボックスを確認すると、リセットメールが届いていました。

メール本文のリンクをクリックしブラウザへ戻ると、パスワード再設定画面に遷移するので、入力し、Reset Password ボタンを押下します。

「パスワードがリセットされました」と表示されれば、パスワードリセット機能の動作確認は完了です。

まとめ

以上で作業は完了です。0からクラス実装を行わなくても認証機能を構築できるのは非常に便利です。パスワードリセットのトークン管理なんかは地味に手間なので、とてもありがたいところです。

ただ、デフォルトではユーザ情報が最低限であったり、パスワードリセットメールが英語であったりと、微妙に使いづらい部分がある事も否めません。

次回はこの機能を拡張し、さらにカスタマイズして独自の認証機能を実装します。

next:Laravel の Auth認証機能をカスタマイズし意図した挙動へ変更する Tips

Author

rito

  • Backend Engineer
  • Tokyo, Japan
  • PHP 5 技術者認定上級試験 認定者
  • 統計検定 3 級