Laravel provides built-in authentication scaffolding that works well for most applications. However, in many cases — especially when building enterprise-level apps or integrating with legacy systems — you’ll need to implement custom Laravel authentication.
In this guide, we’ll walk through how to create a completely customized authentication system in Laravel without relying on the default php artisan make:auth
command.
💡 Why Customize Laravel Authentication?
While Laravel’s default authentication system is robust and secure, it may not always meet your specific needs. Here are some reasons why you might want to build a custom Laravel authentication system:
- You’re integrating with an existing user database
- You need multi-authentication (e.g., admin + frontend users)
- You want to use UUIDs instead of auto-incremented IDs
- You’re implementing advanced features like two-factor authentication or social logins
- You need to comply with internal security standards or third-party APIs
Customizing Laravel authentication gives you full control over the login, registration, password reset, and session management logic.
🛠 Step 1: Set Up a New Laravel Project
Start by creating a new Laravel project:
composer create-project --prefer-dist laravel/laravel custom-auth
Then navigate into the directory:
cd custom-auth
Set up your .env
file and database connection:
cp .env.example .env
php artisan key:generate
Update the database credentials in .env
.
🧾 Step 2: Create the User Model and Migration
If you’re using the default User
model but want more flexibility, consider extending or replacing it.
Run:
php artisan make:model -mf User
This will:
- Create a
User
model (app/Models/User.php
) - Create a migration file
- Create a factory
- Create a seeder
Open the migration file and define your custom fields:
Schema::create('users', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
Then run:
php artisan migrate
🔐 Step 3: Configure Authentication Guards and Providers
Laravel uses guards and providers to manage authentication drivers.
Open config/auth.php
and customize the driver:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'custom_users',
],
],
'providers' => [
'custom_users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
],
This tells Laravel to use your custom User
model and guard.
🧑💻 Step 4: Build Custom Login and Registration Controllers
Instead of using Laravel UI or Breeze, let’s create our own controllers.
php artisan make:controller Auth/LoginController
php artisan make:controller Auth/RegisterController
Example: LoginController.php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
public function showLoginForm()
{
return view('auth.login');
}
public function login(Request $request)
{
$credentials = $request->validate([
'email' => ['required', 'email'],
'password' => ['required'],
]);
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
return redirect()->intended('/dashboard');
}
return back()->withErrors([
'email' => 'The provided credentials do not match our records.',
]);
}
Example: RegisterController.php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
public function register(Request $request)
{
$validated = $request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8'],
]);
$user = User::create([
'name' => $validated['name'],
'email' => $validated['email'],
'password' => Hash::make($validated['password']),
]);
Auth::login($user);
return redirect('/dashboard');
}
🎨 Step 5: Create Blade Views for Login and Registration
Create the following views inside resources/views/auth
:
login.blade.php
register.blade.php
Example form snippet:
<form method="POST" action="{{ route('login') }}">
@csrf
<input type="email" name="email" required>
<input type="password" name="password" required>
<button type="submit">Login</button>
</form>
🚦 Step 6: Define Routes
Update routes/web.php
:
use App\Http\Controllers\Auth\LoginController;
use App\Http\Controllers\Auth\RegisterController;
Route::get('/login', [LoginController::class, 'showLoginForm'])->name('login');
Route::post('/login', [LoginController::class, 'login']);
Route::post('/logout', function () {
auth()->logout();
request()->session()->invalidate();
return redirect('/');
})->name('logout');
Route::get('/register', [RegisterController::class, 'showRegistrationForm'])->name('register');
Route::post('/register', [RegisterController::class, 'register']);
🔒 Step 7: Implement Middleware for Protected Routes
To protect dashboard routes, create a middleware:
php artisan make:middleware EnsureUserIsAuthenticated
Inside EnsureUserIsAuthenticated.php
:
if (!Auth::check()) {
return redirect()->route('login');
}
Apply the middleware in your routes:
Route::get('/dashboard', function () {
return view('dashboard');
})->middleware('auth');
🔄 Step 8: Customize Password Reset Functionality
You can also override the default password reset logic by publishing the relevant stubs:
php artisan vendor:publish --tag=laravel-auth
Then customize the ForgotPasswordController
, ResetPasswordController
, and associated views as needed.
🧪 Step 9: Test Your Custom Laravel Authentication System
Now test your login, registration, logout, and protected routes.
Use tools like Postman or browser dev tools to verify:
- Sessions are being set correctly
- Redirects work as expected
- Errors are handled gracefully
✅ Conclusion
Implementing custom Laravel authentication gives you full control over how users authenticate, register, and interact with your application. Whether you’re integrating with legacy systems or adding extra layers of security, Laravel’s flexible authentication system makes it easy to extend and customize.
By following this guide, you now have a complete understanding of how to build a secure, scalable, and maintainable custom authentication system in Laravel.