Laravel custom login and register Tutorial
This guide will help you set up custom login and registration functionality in Laravel. We'll create a fully functional authentication system using Laravel's powerful features, focusing on custom user login and registration forms. This tutorial is beginner-friendly and assumes that you already have a fresh Laravel project connected to your database.
Views Setup
We will create the views for login, registration, and a simple home page. Create the Layout File Create a layout file at resources/views/index.blade.php:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" /> <meta http-equiv="x-ua-compatible" content="ie=edge" /> <title>Login - Laravel 11</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous" /> </head> <body> @yield('content') <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js" integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r" crossorigin="anonymous" ></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.min.js" integrity="sha384-BBtl+eGJRgqQAUMxJ7pMwbEyER4l1g+O15P+16Ep7Q9Q+zqX6gSbd85u4mG4QzX+" crossorigin="anonymous" ></script> </body> </html>
Login Page
Create the Login View Create a login view at resources/views/login.blade.php:
@extends('index') @section('content') <div class="h-100 d-flex align-items-center justify-content-center" style="height: 100vh!important;"> <main class="form-signin w-25 m-auto bg-body-tertiary p-5" style="width: 60vh!important;"> <form action="{{ route('login.authenticate') }}" method="POST"> @csrf <h1 class="h3 mb-3 fw-normal">Please sign in</h1> @if (Session::has('error')) <div class="message mb-2 text-danger">{{ Session::get('error') }}</div> @endif <div class="form-floating mb-3"> <input type="email" name="email" class="form-control @error('email') is-invalid @enderror" id="email" placeholder="email"> <label for="email">Email address</label> @error('email') <div class="message mb-2 text-danger">{{ $message }}</div> @enderror </div> <div class="form-floating mb-3"> <input type="password" name="password" class="form-control @error('password') is-invalid @enderror" id="password" placeholder="password"> <label for="password">Password</label> @error('password') <div class="message mb-2 text-danger">{{ $message }}</div> @enderror </div> <div class="form-check text-start my-3"> <input class="form-check-input" type="checkbox" value="remember-me" id="flexCheckDefault"> <label class="form-check-label" for="flexCheckDefault"> Remember me </label> </div> <button class="btn btn-primary w-100 py-2" type="submit">{{ __('Sign in') }}</button> <p class="text-center my-4">OR</p> <a href="{{ route('register') }}" class="btn btn-primary py-2 w-100">{{ __('Sign up') }}</a> </form> </main> </div>
Registration View
Create the Registration View Create a registration view at resources/views/register.blade.php:
@extends('index') @section('content') <div class="h-100 d-flex align-items-center justify-content-center" style="height: 100vh!important;"> <main class="form-signin m-auto bg-body-tertiary p-5" style="width: 60vh!important;"> <form action="{{ route('register.authenticate') }}" method="POST"> @csrf <h1 class="h3 mb-3 fw-normal">Please sign up</h1> <div class="form-floating mb-3"> <input type="text" name="name" class="form-control @error('name') is-invalid @enderror" id="name" placeholder="name"> <label for="name">Name</label> @error('name') <div class="message mb-2 text-danger">{{ $message }}</div> @enderror </div> <div class="form-floating mb-3"> <input type="email" name="email" class="form-control @error('email') is-invalid @enderror" id="email" placeholder="email"> <label for="email">Email address</label> @error('email') <div class="message mb-2 text-danger">{{ $message }}</div> @enderror </div> <div class="form-floating mb-3"> <input type="password" name="password" class="form-control @error('password') is-invalid @enderror" id="password" placeholder="password"> <label for="password">Password</label> @error('password') <div class="message mb-2 text-danger">{{ $message }}</div> @enderror </div> <button class="btn btn-primary w-100 py-2" type="submit">{{ __('Sign up') }}</button> <p class="text-center my-4">OR</p> <a href="{{ route('login') }}" class="btn btn-primary py-2 w-100">{{ __('Sign in') }}</a> </form> </main> </div> @endsection
Creating Controller
php artisan make:controller LoginController php artisan make:controller RegisterController
Routes Setup
Define the routes for these controllers in routes/web.php:
Route::middleware('guest')->group(function () { Route::get('/login', [LoginController::class, 'login'])->name('login'); Route::get('/register', [RegisterController::class, 'register'])->name('register'); Route::post('/login/authenticate', [LoginController::class, 'authenticate'])->name('login.authenticate'); Route::post('/register/authenticate', [RegisterController::class, 'store'])->name('register.authenticate'); }); Route::middleware('auth')->group(function () { Route::view('/home', 'home')->name('home'); Route::get('/logout', [LogoutController::class, 'logout'])->name('logout'); });
Controller Setup
Now lets finalize our code, goto your controllers. Goto your App\Http\Controllers\RegisterController
public function register() { return view('register'); } public function store(Request $request) { $request->validate([ 'name' => ['required', 'string', 'min:3', 'max:255'], 'email' => ['required', 'email', 'max:255', 'unique:users,email'], 'password' => ['required', 'min:6'] ]); $user = User::create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), ]); Auth::login($user); return redirect()->route('home'); }
Goto your App\Http\Controllers\LoginController
public function login() { return view('login'); } public function authenticate(Request $request) { $credentials = $request->validate([ 'email' => 'required', 'password' => 'required', ]); $authenticated = Auth::attempt($credentials); if (!$authenticated) { Session::flash('error', "Credentials does not match our record."); return Redirect::back(); } else { return redirect()->route('home'); } }
Goto your App\Http\Controllers\LogoutController
public function logout() { Session::flush(); Auth::logout(); return redirect()->route('login'); }