LaravelではBreezeやSanctumなどのパッケージを使って認証機能を手軽に実装できますが、仕組みを深く理解したい場合やカスタム要件がある場合には、Authを使わずに自作することが有効です。この記事では、Laravelでログイン・ログアウト処理を手動で構築する方法をステップごとに解説します。
前提:usersテーブルの準備
以下のようなusers
テーブルが存在していることを前提とします。
- email(ログインID)
- password(ハッシュ化されたパスワード)
マイグレーション例:
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('email')->unique();
$table->string('password');
$table->timestamps();
});
ログインフォームの作成
以下のようなシンプルなログインフォームを用意します。
<form method="POST" action="{{ route('login.process') }}">
@csrf
<input type="email" name="email" placeholder="メールアドレス">
<input type="password" name="password" placeholder="パスワード">
<button type="submit">ログイン</button>
</form>
ルート定義
web.phpでログイン処理のルートを定義します。
use App\Http\Controllers\AuthController;
Route::get('/login', [AuthController::class, 'showLoginForm'])->name('login');
Route::post('/login', [AuthController::class, 'login'])->name('login.process');
Route::post('/logout', [AuthController::class, 'logout'])->name('logout');
ログイン処理の実装
AuthController
を作成し、ログイン処理を記述します。
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
class AuthController extends Controller
{
public function showLoginForm()
{
return view('auth.login');
}
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
$user = User::where('email', $credentials['email'])->first();
if (!$user || !Hash::check($credentials['password'], $user->password)) {
return back()->withErrors([
'login' => 'メールアドレスまたはパスワードが正しくありません。',
]);
}
session(['login_user' => $user->id]);
return redirect()->intended('/dashboard');
}
public function logout(Request $request)
{
$request->session()->forget('login_user');
return redirect('/login');
}
}
ログイン状態のチェック
コントローラやBladeでログイン状態を確認したい場合は、セッションをチェックします。
if (session()->has('login_user')) {
// ログイン中
}
ログインユーザーの情報を取得したい場合:
$user = \App\Models\User::find(session('login_user'));
ログイン必須ページへのアクセス制御
ログインしていない場合にログインページへリダイレクトするミドルウェアを作成します。
php artisan make:middleware CheckLogin
中身を以下のように編集します。
public function handle($request, Closure $next)
{
if (!session()->has('login_user')) {
return redirect()->route('login');
}
return $next($request);
}
このミドルウェアをkernel.php
に登録し、必要なルートへ適用します。
'check.login' => \App\Http\Middleware\CheckLogin::class,
Route::middleware(['check.login'])->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index']);
});
まとめ
LaravelのAuth機能を使わずにログイン処理を自作することで、認証の仕組みを深く理解し、柔軟なカスタマイズが可能になります。セッションを用いたユーザー管理、パスワードのハッシュチェック、ログイン状態の確認など、基本的な流れを押さえることが重要です。
本格的なアプリケーションに発展させるには、CSRF保護やパスワード再設定機能、多要素認証などの追加実装も検討するとよいでしょう。