Authentication in Laravel 12
Laravel 12 introduces completely new starter kits that replace Breeze and Jetstream, providing authentication scaffolding with modern frontend stacks.
Choosing a Starter Kit
When creating a new Laravel 12 project, choose your starter kit:
laravel new my-app
# Select: React, Vue, or Livewire starter kit
React Starter Kit — Inertia 2 + React 19 + TypeScript + shadcn/ui Vue Starter Kit — Inertia 2 + Vue 3 + TypeScript + shadcn-vue Livewire Starter Kit — Livewire 3 + Flux UI + Laravel Volt
All include login, registration, password reset, and email verification out of the box.
Manual Authentication Setup
For custom authentication without starter kits:
// routes/web.php
Route::middleware('guest')->group(function () {
Route::get('/login', [AuthController::class, 'showLogin'])->name('login');
Route::post('/login', [AuthController::class, 'login']);
Route::get('/register', [AuthController::class, 'showRegister'])->name('register');
Route::post('/register', [AuthController::class, 'register']);
});
Route::post('/logout', [AuthController::class, 'logout'])
->middleware('auth')
->name('logout');
class AuthController extends Controller
{
public function login(LoginRequest $request): RedirectResponse
{
$request->authenticate();
$request->session()->regenerate();
return redirect()->intended(route('dashboard'));
}
public function register(RegisterRequest $request): RedirectResponse
{
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
Auth::login($user);
return redirect()->route('dashboard');
}
public function logout(Request $request): RedirectResponse
{
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
}
Protecting Routes
Route::middleware('auth')->group(function () {
Route::get('/dashboard', DashboardController::class)->name('dashboard');
Route::resource('/posts', PostController::class);
});
Email Verification
class User extends Authenticatable implements MustVerifyEmail {}
Route::middleware(['auth', 'verified'])->group(function () {
Route::get('/dashboard', DashboardController::class);
});