Laravel5でユーザー認証の設定

PHPのユーザー認証はニーズがあるわりに作るのが非常に面倒くさいです。Ruby on Railsなどではこれらの作業が比較的シンプルに実装できたりしますが、PHPではこれらはフレームワークを使わないとかなり面倒くさいことになります。Larabel5でも認証に関する動作はあらかじめフレームワーク内にその機能が実装されています。

ユーザー認証で必要な機能といえば、

  • ユーザー登録
  • ユーザー認証
  • Mypage(ログインしてから表示されるページ)
  • パスワードの再発行
  • ユーザー情報の更新や削除
  • 退会

などになります。
これらの機能はDBも必要になるし、セキュリティー上ややこしいことにもなるわけですが、これらの機能をできるだけシンプルに導入できるようにLaravelもまたあらかじめ設計されています。

シンプルな認証機能を実装してみる

https://readouble.com/laravel/5.5/ja/authentication.html
Documentにあるようなシンプルな認証機能を実装してみます。

1. ユーザーテーブルの作成

ユーザーテーブルの作成は、migrationで簡単に実行できます。Laravelのホームディレクトリで、

php artisan migrate

を実行します。データベースの設定は予め行っておいてください。
コマンドを実行すると、

  • migrations
  • password_resets
  • users

が作成されています。

余談ですが、もしこれらのファイルにカスタマイズを加えて失敗したら、同様のコマンドで上書きする(初期化)することができます。

php artisan migrate
The [layouts/app.blade.php] view already exists. Do you want to replace it? (yes/no) [no]:
 > yes

yesと入力します。

2. 認証・ルーティング

ちょっと前のLaravelだとルーティングとか自分で設定しないといけないみたいですが、最新のものはartisanコマンドでほぼほぼ出来上がってしまうという完璧さ。

php artisan make:auth

ルーティングを確認すると、

Method URI Name Action Middleware
GET HEAD home home App\Http\Controllers\HomeController@index | web,auth
GET HEAD login login App\Http\Controllers\Auth\LoginController@showLoginForm | web,guest
POST login App\Http\Controllers\Auth\LoginController@login web,guest
POST logout logout App\Http\Controllers\Auth\LoginController@logout web
POST password/email password.email App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail web,guest
GET HEAD password/reset password.request App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest
POST password/reset App\Http\Controllers\Auth\ResetPasswordController@reset web,guest
GET HEAD password/reset/{token} password.reset App\Http\Controllers\Auth\ResetPasswordController@showResetForm | web,guest
GET HEAD register register App\Http\Controllers\Auth\RegisterController@showRegistrationForm | web,guest
POST register App\Http\Controllers\Auth\RegisterController@register web,guest

いっぱい作成されています。

3. viewの作成

以前は、ルーティングで設定したパスにアクセスするとviewテンプレートがないのでエラーになりました。
Laraver5.5だと最初からviewも作成されていましたので、楽です。

  • resources/views/auth/login.blade.php
  • resources/views/auth/register.blade.php

これでアクセスすると、登録機能とログイン機能ができてしまっています。
コントローラを全く作成していませんが、デフォルトでここまでの機能が実現できるようになっています。
また、ここまでの設定では、登録するとすぐにログインした状態になります。ログアウトの機能などは実装されていません。(しかも英語のみ)

http://example.com/register

で登録し、

http://example.com/login

からログインできるようになっています。
データベースにはユーザーが登録されているはずです。

4. ユーザー登録機能をカスタマイズする

ユーザーの登録機能は、

Illuminate\Foundation\Auth\RegistersUsers

で行っています。パスで言うと、

vendor/laravel/framework/src/Illuminate/Foundation/Auth/RegistersUsers.phpになります。

になります。このクラスの中の

public function postRegister(Request $request)
{
   return $this->register($request);
}

がユーザー登録を担っています。なので、ここにカスタマイズを加えるわけですが、実際はvendor以下を直接触ることはしません。実コントローラでこのクラスをオーバーライドします。

app/Http/Controllers/Auth/AuthController.php

内に、 postRegister()メソッドを書くと、オーバーライドしてくれます。

仕組み

Formからアクセスしているコントローラは、

app/Http/Controllers/Auth/ForgotPasswordController.php
app/Http/Controllers/Auth/LoginController.php
app/Http/Controllers/Auth/RegisterController.php
app/Http/Controllers/Auth/ResetPasswordController.php

です。

Last update: 2018.04.06 (金)