RitoLabo

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

  • 公開:
  • 更新:
  • カテゴリ: PHP Laravel
  • タグ: PHP,Laravel,5.5,5.4,5.3,Beginner,Mail,Auth,5.6

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

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

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

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

開発環境について

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

  • Linux CentOS 7
  • Apache 2.4
  • MySQL 5.7
  • PHP 7.1
  • Laravel 5.x

Laravelのバージョンに関しては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からクラス実装を行わなくても認証機能を構築できるのは非常に便利です。パスワードリセットのトークン管理なんかは地味に手間なので、とてもありがたいところです。

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

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