Authentication is a fundamental part of any web application, ensuring that users can securely log in and access protected content. While Laravel provides built-in authentication scaffolding, sometimes developers prefer manual authentication for better control and customization.
In this guide, we will implement manual authentication in Laravel 12 without using packages like laravel/ui
or breeze
. We'll cover:
✔ User registration
✔ User login
✔ Session handling
✔ Logout functionality
✔ Middleware for access control
By the end, you’ll have a fully functional authentication system in Laravel 12. Let's get started! 🚀
Step 1: Install Laravel 12
First, install a fresh Laravel 12 project via Composer:
composer create-project laravel/laravel AuthApp
Move into the project directory:
cd AuthApp
Step 2: Configure Database
Open the .env
file and set up your database connection:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=auth_db
DB_USERNAME=root
DB_PASSWORD=
Run migrations to create the default users table:
php artisan migrate
Step 3: Create Authentication Routes
Open routes/web.php
and define login, register, and logout routes.
use App\Http\Controllers\AuthController;
use Illuminate\Support\Facades\Route;
Route::get('/register', [AuthController::class, 'showRegister'])->name('register');
Route::post('/register', [AuthController::class, 'register']);
Route::get('/login', [AuthController::class, 'showLogin'])->name('login');
Route::post('/login', [AuthController::class, 'login']);
Route::get('/dashboard', [AuthController::class, 'dashboard'])->middleware('auth')->name('dashboard');
Route::post('/logout', [AuthController::class, 'logout'])->name('logout');
Step 4: Create Authentication Controller
Run the command:
php artisan make:controller AuthController
Now, open app/Http/Controllers/AuthController.php
and add the following code:
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class AuthController extends Controller
{
// Show register form
public function showRegister()
{
return view('auth.register');
}
// Handle registration
public function register(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users|max:255',
'password' => 'required|min:6|confirmed',
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
Auth::login($user);
return redirect()->route('dashboard');
}
// Show login form
public function showLogin()
{
return view('auth.login');
}
// Handle login
public function login(Request $request)
{
$credentials = $request->validate([
'email' => 'required|email',
'password' => 'required',
]);
if (Auth::attempt($credentials)) {
return redirect()->route('dashboard');
}
return back()->withErrors(['email' => 'Invalid login credentials']);
}
// Show dashboard (protected)
public function dashboard()
{
return view('dashboard');
}
// Handle logout
public function logout()
{
Auth::logout();
return redirect()->route('login');
}
}
Step 5: Create Blade Views
Create the auth views inside resources/views/auth/
:
1️⃣ Register Page (resources/views/auth/register.blade.php
)
<!DOCTYPE html>
<html>
<head>
<title>Register</title>
</head>
<body>
<h2>Register</h2>
<form action="{{ route('register') }}" method="POST">
@csrf
<input type="text" name="name" placeholder="Name" required><br>
<input type="email" name="email" placeholder="Email" required><br>
<input type="password" name="password" placeholder="Password" required><br>
<input type="password" name="password_confirmation" placeholder="Confirm Password" required><br>
<button type="submit">Register</button>
</form>
<a href="{{ route('login') }}">Already have an account? Login</a>
</body>
</html>
resources/views/auth/login.blade.php
)<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<h2>Login</h2>
<form action="{{ route('login') }}" method="POST">
@csrf
<input type="email" name="email" placeholder="Email" required><br>
<input type="password" name="password" placeholder="Password" required><br>
<button type="submit">Login</button>
</form>
<a href="{{ route('register') }}">Create an account</a>
</body>
</html>
3️⃣ Dashboard Page (resources/views/dashboard.blade.php
)
<!DOCTYPE html>
<html>
<head>
<title>Dashboard</title>
</head>
<body>
<h2>Welcome, {{ Auth::user()->name }}</h2>
<form action="{{ route('logout') }}" method="POST">
@csrf
<button type="submit">Logout</button>
</form>
</body>
</html>
Step 6: Create Authentication Middleware
php artisan make:middleware AuthMiddleware
Modify app/Http/Middleware/AuthMiddleware.php
:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class AuthMiddleware
{
public function handle(Request $request, Closure $next)
{
if (!Auth::check()) {
return redirect()->route('login');
}
return $next($request);
}
}
Register this middleware in app/Http/Kernel.php
inside $routeMiddleware
:
'auth' => \App\Http\Middleware\AuthMiddleware::class,
Step 7: Test the Authentication
php artisan serve
✅ We manually built authentication in Laravel 12.
✅ It includes registration, login, logout, session handling, and middleware.
✅ This method provides full control over authentication logic.
Let me know if you need additional features like password reset! 🚀