Create Laravel Authentication Project

Create Laravel Authentication Project

Introduction

In modern web application development, authentication and authorization are crucial aspects of building secure and robust systems. Laravel, one of the most popular PHP frameworks, provides an extensive authentication system out of the box, making it easier for developers to implement secure login, registration, password reset, and other user-related features.

This comprehensive guide explores every facet of Laravel's authentication system, including:

  • Setting up and configuring Laravel authentication
  • User registration and login
  • Password hashing and resets
  • Email verification
  • Customizing authentication controllers and views
  • Guard and provider configurations
  • Middleware for route protection
  • Two-factor authentication
  • Best security practices

By the end of this article, you'll have a deep understanding of how Laravel handles authentication and how you can customize it to fit your specific project needs.

1. Getting Started with Laravel Authentication

1.1 Installing Laravel

First, ensure that you have Composer installed on your machine. To create a new Laravel project, run:

composer create-project --prefer-dist laravel/laravel laravel-auth
cd laravel-auth
php artisan serve

Visit http://localhost:8000 in your browser to confirm the new Laravel application is running.

1.2 Database Configuration

Set up your .env file with the database credentials. For example:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_auth
DB_USERNAME=root
DB_PASSWORD=

Run migrations:

php artisan migrate

Laravel's default migrations will create a users table, which is essential for authentication.

2. Authentication Scaffolding

2.1 Laravel UI vs. Breeze vs. Jetstream

Laravel offers multiple starter kits to scaffold authentication:

  • Laravel UI: Provides basic Bootstrap-based views and routes. Ideal for simple needs.
  • Laravel Breeze: A minimal and simple implementation with Blade and Tailwind CSS.
  • Laravel Jetstream: A more advanced solution with optional Livewire or Inertia.js support, teams, API tokens, and two-factor authentication.

Installing Laravel UI

composer require laravel/ui:^3.0
php artisan ui bootstrap --auth
npm install && npm run dev

Installing Laravel Breeze

composer require laravel/breeze --dev
php artisan breeze:install
npm install && npm run dev

Installing Laravel Jetstream

composer require laravel/jetstream
php artisan jetstream:install livewire
npm install && npm run dev

3. Understanding the Authentication Flow

Laravel's authentication flow comprises several key steps:

  1. User clicks "Register", fills in details, and submits the form.
  2. Data validation using Form Requests or controller validation.
  3. Password hashing using Laravel's built-in Hash facade.
  4. User model creation via Eloquent.
  5. Login: verifying credentials via Auth::attempt().
  6. Session management: storing user session data securely.
  7. Redirecting authenticated users to the dashboard or intended location.

4. Registration

4.1 Default Registration Controller

Laravel's default RegisterController resides in App\Http\Controllers\Auth\RegisterController. It uses the RegistersUsers trait:

namespace App\Http\Controllers\Auth;

use App\Models\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;

class RegisterController extends Controller
{
    use RegistersUsers;

    protected $redirectTo = '/home';

    public function __construct()
    {
        $this->middleware('guest');
    }

    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    }

    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
        ]);
    }
}

4.2 Customizing Registration

To add fields (e.g., username), update:

  1. Migration: add username column.
  2. Model: add username to $fillable.
  3. Validator: include rules for username.
  4. Create method: assign $data['username'].
  5. Registration view: add input field.
<div class="form-group">
  <label for="username">Username</label>
  <input id="username" type="text" name="username" class="form-control" required>
</div>

5. Login

5.1 Default Login Controller

The LoginController uses the AuthenticatesUsers trait:

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    use AuthenticatesUsers;

    protected $redirectTo = '/home';

    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }
}

5.2 Customizing Login

To use username instead of email, override username():

public function username()
{
    return 'username';
}

Add login throttling to prevent brute-force attacks:

protected function sendLoginResponse(Request $request)
{
    $request->session()->regenerate();
    $this->clearLoginAttempts($request);

    return $this->authenticated($request, $this->guard()->user())
            ?: redirect()->intended($this->redirectPath());
}

6. Password Handling

6.1 Password Hashing

Laravel uses Bcrypt by default via Hash::make(). You can switch to Argon2 by specifying in config/hashing.php:

'driver' => 'argon2id',

6.2 Password Reset

Laravel ships with password reset functionality. It includes:

  • ForgotPasswordController with sendResetLinkEmail().
  • ResetPasswordController with reset().
  • Password reset routes in routes/web.php:
  • Auth::routes(['verify' => true]);

Run:

php artisan make:notification ResetPasswordNotification

Then customize the notification template in resources/views/emails/password.blade.php.

7. Email Verification

To ensure users verify their email before accessing protected routes:

  1. Enable verification in User model:
  2. use Illuminate\Contracts\Auth\MustVerifyEmail;
    
    class User extends Authenticatable implements MustVerifyEmail
    {
        // ...
    }
  3. Include verified middleware:
  4. Route::get('/profile', 'ProfileController@index')->middleware('verified');
  5. Customize verification email in resources/views/auth/verify.blade.php.

8. Guards and Providers

8.1 Providers

Define how users are retrieved from storage in config/auth.php:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
    ],
],

8.2 Guards

Guards define how users are authenticated for each request:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => false,
    ],
],

For multiple user types (e.g., admins), add a provider and guard:

'providers' => [
  'admins' => [
    'driver' => 'eloquent',
    'model' => App\Models\Admin::class,
  ],
],
'guards' => [
  'admin' => [
    'driver' => 'session',
    'provider' => 'admins',
  ],
],

9. Middleware Protection

Use middleware to protect routes:

Route::group(['middleware' => ['auth']], function () {
    Route::get('/dashboard', 'DashboardController@index');
});

Combine with role-based access:

Route::group(['middleware' => ['auth', 'role:admin']], function () {
    // Admin-only routes
});

10. Two-Factor Authentication (2FA)

Laravel Fortify provides 2FA support:

composer require laravel/fortify
php artisan vendor:publish --provider="Laravel\Fortify\FortifyServiceProvider"

Configure in config/fortify.php:

'features' => [
    Features::twoFactorAuthentication([
        'confirmPassword' => true,
    ]),
],

Create views and controllers to manage 2FA settings, such as QR code display and recovery codes.

11. Best Practices and Security Tips

  • Use HTTPS: Always serve authentication pages over SSL/TLS.
  • Strong Password Rules: Enforce complex passwords and password resets.
  • Rate Limiting: Use Laravel's throttle middleware on login and registration routes.
  • Session Security: Regenerate session ID upon login and logout.
  • CSRF Protection: Laravel includes CSRF tokens; ensure forms include @csrf.
  • Email Verification: Prevent unverified accounts from accessing sensitive areas.
  • Audit Logging: Record login attempts and password changes for auditing.
  • Dependencies: Keep Laravel and its packages up to date to patch vulnerabilities.

Conclusion

Laravel's authentication system is both powerful and flexible. From basic login and registration to advanced features like two-factor authentication, Laravel provides the tools you need to secure your application. By understanding the underlying traits, controllers, guards, and middleware, you can tailor authentication to fit any requirement.

Whether you're building a small application or a large enterprise system, following the practices outlined in this guide will ensure your user authentication is robust, secure, and maintainable. 

#Laravel authentication #Laravel login #user registration #password reset #email verification #Laravel Breeze #Laravel Jetstream #Laravel Fortify #PHP security

Subscribe to our newsletter

12k+

Subscribers

Weekly

Frequency

Free

Always