Laravelで実装する認証と認可:簡単なセットアップと基本操作
背景
Webアプリの認証・認可の実装って、結構大変なことですよね。
でも、Laravelを使えば、こういうリスクのある作業を自分でやらなくても、デフォルトでしっかりした機能が用意されているんです。
問題点
なんで難しいかって? それはですね… コードにバグや脆弱性があったら、情報漏洩とか不正アクセスにつながって、会社の信用問題になりかねません。
だから、認証・認可まわりを実装するときは、「本当にミスはないか?」って、めちゃくちゃ慎重になる必要があります。
さらにマズいことに、脆弱性ってどんどん新しく出てくるんですよね。そういう問題全部に対応し続けるのって、専門知識もいるし、お金も時間もすごくかかります。
どうすればいい?
でも、もう心配しなくて大丈夫!
Laravelフレームワークなら、認証・認可に関する多くの機能がデフォルトで組み込まれて、安全な開発をサポートしてくれます。CSRF保護やパスワードハッシュ化、SQLインジェクション対策などもLaravelがうまく処理してくれる部分が多いです。
では、実際に見ていきましょう。
プロジェクトの作成
前提として、PHP, Composer, NodeJSが必要です。NodeJSのインストールの手順はこちら。
まず、PHPやComposerをインストールしましょう。
- macOSの方は
/bin/bash -c "$(curl -fsSL https://php.new/install/mac/8.4)"
- Linuxの方は
/bin/bash -c "$(curl -fsSL https://php.new/install/linux/8.4)"
そして、laravelを。(OSを問わず)
composer global require laravel/installer
次は新しいプロジェクトを作成します。(名前はtutorialにしましたが自由に名付けてください)
laravel new tutorial
作成中にstarter kitを聞かれる時は好きなフレームワーク(React, Vueなど)を選択します。私はReactを選択しました。そして、最も大事な部分はauthentication providerの時はLaravel's built-in authenticationを選択してください。
終わったら:
cd tutorial
composer run dev
これで、 http://127.0.0.1:8000/ にアクセスするとWebサイトが表示されます。
画面右上に「Log in」(ログイン)と「Register」(登録)のリンクがあるはずです。実際にユーザー登録してからログインしてみましょう。すべてスムーズに進むはずです。
これで基本的なユーザー認証機能が実装されました。次は実際のアプリケーション開発に集中できます。
LaravelはOSSなので、もし脆弱性がありましたら速やかパッチされます。これはすごく大事なポイントです。
ファイル閲覧
裏側では何が起こっているのでしょう? まずユーザー認証関連のルート定義を見てみましょう。
Route::middleware('guest')->group(function () {
Route::get('register', [RegisteredUserController::class, 'create'])
->name('register');
// 。。。
Route::get('login', [AuthenticatedSessionController::class, 'create'])
->name('login');
Route::post('login', [AuthenticatedSessionController::class, 'store']);
// 。。。
});
最初は少し複雑に見えるかもしれませんが、基本的な使い方であればこのファイルを直接編集する必要は少ないです。しかし、仕組みを理解することは、より高度なカスタマイズや問題解決に役立ちます。
Route::middleware('guest')
という部分に注目してください。これは「ログインしていないユーザー(ゲスト)だけがアクセスできるルート」を定義するものです。登録ページやログインページは、すでにログインしているユーザーが表示する必要はないため、このミドルウェアで制御されています。
逆にRoute::middleware('auth')
は、「ログインしているユーザーだけがアクセスできるルート」を定義します。ログアウト処理などがこれに該当します。ダッシュボードなど、認証が必要なページの多くもこのミドルウェアで保護されます。
このようにミドルウェアを使うことで、リクエストに対するアクセス制御(認可)を行うことができます。Laravelには標準で多くのミドルウェアが用意されていますが、自分で独自の基準を作りたい場合は、次のようにします。
認可の基準を作りましょう
例として、「メールアドレスが @gmail.com で終わるユーザーのみ」という条件を定義します。この条件を使って、特定の設ページへのアクセスを制御してみましょう。
まず、ターミナルで次のコマンドを実行して、新しいミドルウェアを作成します。
php artisan make:middleware EnsureEmailIsGmail
作成されたファイルを以下のように編集しましょう。
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;
class EnsureEmailIsGmail
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
// 基準
if (!str_ends_with(Auth::user()->email, '@gmail.com')) {
return redirect()->route('dashboard');
}
return $next($request);
}
}
Laravelの魔法でログインされているユーザー(Auth::user()
)のIDやメールなどの情報を簡単にアクセスできる。
最後にこの条件を使って、設定のAppearanceのページを制限しましょう。
<?php
use App\Http\Controllers\Settings\PasswordController;
use App\Http\Controllers\Settings\ProfileController;
use Illuminate\Support\Facades\Route;
use Inertia\Inertia;
Route::middleware('auth')->group(function () {
Route::redirect('settings', 'settings/profile');
Route::get('settings/profile', [ProfileController::class, 'edit'])->name('profile.edit');
Route::patch('settings/profile', [ProfileController::class, 'update'])->name('profile.update');
Route::delete('settings/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
Route::get('settings/password', [PasswordController::class, 'edit'])->name('password.edit');
Route::put('settings/password', [PasswordController::class, 'update'])->name('password.update');
Route::get('settings/appearance', function () {
return Inertia::render('settings/appearance');
})->name('appearance')
// 制限
->middleware(\App\Http\Middleware\EnsureEmailIsGmail::class);
});
これで、メールアドレスが@gmail.com
で終わるユーザーだけが/settings/appearance
ページにアクセスできます。
異なるドメインのメールアドレス(例: tutorial@example.com
)で登録したアカウントでアクセスしてみて、リダイレクトされることを確認してみてください。
まとめ
自前での認証実装は複雑でリスクが伴いますが、Laravelを使えば安全な機能を簡単に導入できます。
この記事では、認証機能のセットアップからミドルウェアを使ったアクセス制限まで、基本的な使い方を紹介しました。
これにより開発者はセキュリティの心配を減らしてコア機能の開発に集中できます。
Discussion