はじめに
LaravelのWebアプリに10分で認証機能を追加します。
予めLaravelプロジェクトやSQLite3が用意できていれば、10分もかからず3分でもできるかもしれません。。。
それくらい簡単!
Laravel公式ガイド
Laravel公式ガイドの認証に関する情報は以下のページにあります。
ざっくり手を動かしてみたら、一読することをオススメします。
ログイン認証機能の追加手順
Laravelプロジェクトがまだ無い状態を想定して、プロジェクト作成から進めます。
デモ用のLaravelプロジェクトを作成
Laravelプロジェクトを作成
composer create-project laravel/laravel=5.7 laravel_auth_demo
SQLiteデータベースファイル作成
touch database/database.sqlite
LaravelプロジェクトのDB接続情報を変更
viで設定ファイルを開きます。
vi .env
以下の記述を、
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
以下のように書き換えます。
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
を開いて、アカウント登録画面が表示されることを確認してください。
アカウントを登録したら、Dashboardというページが表示されます。
右上のユーザアカウント名のセレクトボックスからLogoutを選択してログアウトしてみてください、
ログイン
http://127.0.0.1:8000/login
を開いて、ログイン画面が表示されることを確認してください。
先ほど作成したユーザ情報でログインできることを確認してください。
※パスワードのリセット機能は、サーバからメールを送信する機能を実装しないと動作しません
ここまでで、Laravelにログイン認証機能を追加する対応は完了です。
ルートの保護を行う
この時点では、まだユーザの登録・ログインができるだけなので、どのビューに対してもログインによる保護がかかっていない状態(ログインしていなくてもアクセスできてしまう状態)です。
そのため、ルートの保護を設定してログインしていないと見れないページを作成してみます。
確認用のテストページを追加
ビューファイルを作成します。
touch /resources/views/test.blade.php
以下のような内容で保存しておきます。
<h1>テストページ</h1>
<p>このページはログインしているユーザにしか見せたくない。。。</p>
テストページへのルーティングを設定
web.phpを開きます。
vi /routes/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
へアクセスしてみます。
まだ保護していないので、ログインしていないのにページが見えちゃいますね。。。
ルートの保護を行う
web.phpを再度開きます。
vi /routes/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
へアクセスしてみます。
ルートの保護がされているビューをログインしていない状態で表示しようとすると、ログインページへリダイレクトされます。
続けてログインすると、もともと見ようとしていたビューを表示してくれます。
まとめ
10分でLaravelプロジェクトにログイン認証機能を追加できましたでしょうか?
慣れれば10分と言わず、3分もかからずに追加できるほど簡単ですね。