Laravel Auth Login with Username or Email Example; In this tutorial we will show you how to implement login via username or email in laravel application using one field.
Laravel default authentication allows you to login with an email only but we can also use some other field like username. Laravel by default only allows one field ’email’ for login but we can also use username with it as well.
So, follow the following steps for laravel auth login with username or email using one field example tutorial.
Step 1: Install Laravel
First, at all open your terminal and run the following command for creating new laravel application.
composer create-project --prefer-dist laravel/laravel laravel-app
Go inside the app:
cd laravel-app
Step 2: Install Laravel UI & Auth Scaffolding
For laravel 5< below version:
php artisan make:auth
For laravel 5+ below version:
Now install the laravel ui package using the below command:
composer require laravel/ui
Now you can install the following commands as per your requirements:
php artisan ui vue --auth
Install NPM Dependencies:
Install the npm dependencies in your laravel app.
npm install
npm run dev
Step 3: Update Users Migration File
Now open your users migration file and add username column on it just like below.
database\migrations\2014_10_12_000000_create_users_table.php
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->string('username');
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
After that all things happen now run the migrate command to generate authentication database columns using the following command:
php artisan migrate
Step 4: Update User Model
We need to add username in the $fillable array. So, open the app\Models\User.php file and update the below code:
protected $fillable = [
'name', 'email', 'password', 'username'
];
Step 5: Update Register Controller
Next, open the app\Http\Controllers\Auth\RegisterController.php file and update the validation function and create same like below we have updated
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'username' => 'required|string|max:20|unique:users',
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:6', 'confirmed'],
]);
}
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'username' => $data['username'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}
Step 6: Update Login Controller
Next, open the app\Http\Controllers\Auth\LoginController.php file and override the methods same like below code:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Auth;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
/**
* Override login function for login with email or username.
*/
public function login(Request $request)
{
$this->validate($request, [
'email' => 'required',
'password' => 'required|min:6'
]);
$email = $request->get('email');
$password = $request->get('password');
$remember_me = $request->remember;
$login_type = filter_var($email, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
if (Auth::attempt([$login_type => $email, 'password' => $password], $remember_me)) {
//Auth successful here
return redirect()->intended($this->redirectPath());
}
return redirect()->back()
->withInput()
->withErrors([
'login_error' => 'These credentials do not match our records.',
]);
}
}
Step 7: Update Register Blade File
Next open the resources\views\auth\register.blade.php and update a new field named as username in register blade file, so the user login via username or email in laravel application.
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __('Register') }}</div>
<div class="card-body">
<form method="POST" action="{{ route('register') }}">
@csrf
<div class="form-group row">
<label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Name') }}</label>
<div class="col-md-6">
<input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>
@error('name')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="username" class="col-md-4 col-form-label text-md-right">{{ __('Username') }}</label>
<div class="col-md-6">
<input id="name" type="text" class="form-control @error('username') is-invalid @enderror" name="username" value="{{ old('username') }}" required autocomplete="username" autofocus>
@error('username')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email">
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>
<div class="col-md-6">
<input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
</div>
</div>
<div class="form-group row mb-0">
<div class="col-md-6 offset-md-4">
<button type="submit" class="btn btn-primary">
{{ __('Register') }}
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
Step 8: Update Login Blade File
Next, open the resources\views\auth\login.blade.php file and update the text email field so the user can login their username or email field.
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __('Login') }}</div>
<div class="card-body">
<form method="POST" action="{{ route('login') }}">
@csrf
<div class="form-group row">
<label for="email" class="col-md-4 col-form-label text-md-right">{{ __('Username or Email') }}</label>
<div class="col-md-6">
<input id="email" type="text" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<div class="col-md-6 offset-md-4">
<div class="form-check">
<input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>
<label class="form-check-label" for="remember">
{{ __('Remember Me') }}
</label>
</div>
</div>
<div class="col-md-6 offset-md-4">
@error('login_error')
<span class="text-danger"><strong>{{ $message }}</strong></span>
@enderror
</div>
</div>
<div class="form-group row mb-0">
<div class="col-md-8 offset-md-4">
<button type="submit" class="btn btn-primary">
{{ __('Login') }}
</button>
@if (Route::has('password.request'))
<a class="btn btn-link" href="{{ route('password.request') }}">
{{ __('Forgot Your Password?') }}
</a>
@endif
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
Step 9: Run Development Server
Now run the this command and test the login via email or username process in laravel application:
php artisan serve
Now you can copy the url and put in browser for testing laravel login using email and username example;
http://localhost:8000/
That’s all, laravel login with email or username tutorial is completed now, I hope you enjoy with this.