In this article we’ll cover multiple authentication in Laravel 5.6. Multiple authentication in this context is simply the process of authenticating against multiple user models.

In the following sections, we’ll demonstrate Laravel’s built-in authentication functionality. More specifically, I will show you how to authenticate an admin user and a normal user.


Step 1: Laravel Setup

Set up the Laravel project using composer.

composer create-project --prefer-dist laravel/laravel project-name

Step 2: Database Configuration

Open the .env file and set database credentials in the file.

DB_DATABASE= database-name
DB_USERNAME= root
DB_PASSWORD= database-password

Step 3: Authentication

To make use of Laravel’s built-in authentication system for registration and login, simply run the following command:

php artisan make:auth

Step 4: Setting up Models and Migrations

Create and set up the model and migration for Admin:

php artisan make:model Admin -m
To set up the model for Admin, go to app/Admin.php and update the code with the following:
/**
 * Remove 'use Illuminate\Database\Eloquent\Model;'
 */
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Admin extends Authenticatable
{
    use Notifiable;
// The authentication guard for admin
    protected $guard = 'admin';
     /**
      * The attributes that are mass assignable.
      *
      * @var array
      */
    protected $fillable = [
        'email', 'password',
    ];
     /**
      * The attributes that should be hidden for arrays.
      *
      * @var array
      */
    protected $hidden = [
        'password', 'remember_token',
    ];
To set up the migration table for Admin, go to database/migration/***_create_admins_table.php and update the code with the following:
//
{
    Schema::create('admins', function (Blueprint $table) {
            $table->increments('id');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
    });
 }
//

Step 5: Set up the Admin Controller

To create the controller for the Admin, run the following command:

php artisan make:controller AdminController

To set up the controller, go to app/Http/Controllers/AdminController.php and update the code with the following:

class AdminController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth:admin');
    }
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('admin');
    }
}

Step 6: Set up the Login Controller for a Admin User

To create the Login controller, run the following command:

php artisan make:controller Auth/AdminLoginController
To set up a login controller, go to app/Http/Controllers/Auth/AdminLoginController.php and update the code with the following:
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\Auth;
class AdminLoginController extends Controller
{
    /**
     * Show the application’s login form.
     *
     * @return \Illuminate\Http\Response
     */
    public function showLoginForm()
    {
        return view(’auth.admin-login’);
    }
    protected function guard(){
        return Auth::guard('admin');
    }
    
    use AuthenticatesUsers;
    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/admin/dashboard';
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest:admin')->except('logout');
    }
}

Step 7: Set up the Login Controller for a Normal User

To set up the login controller for a normal user, go to app/Http/Controllers/Auth/LoginController.php and update the code with the following:

//
/**
 * Show the application's login form.
 *
 * @return \Illuminate\Http\Response
 */
public function showLoginForm()
{
    return view('auth.login');
}
//

Step 8: Set up the Login View for Admin

To create and set up the login view for Admin, go to resources/views/auth/ and create a new file admin-login.blade.php. Copy the code in resources/views/auth/login.blade.php and paste in the new file. 

Now update the new file with the following:

// 
<div class="card-header">{{ __('Admin Login') }}</div>
<div class="card-body">
  <form method="POST" action="{{ route('admin.login.submit') }}">
//

Step 9: Set up the Home View for Admin

To create and set up the home view for Admin, go to resources/views/ and create a new file admin-home.blade.php. Copy the code in resources/views/home.blade.php and paste in the new file. 

Now update the new file with the following:

// 
<div class="card">
   <div class="card-header">Admin Dashboard</div>
//

Step 10: Set up the Web Application Routes

To set up the web routes for your application, go to routes/web.php and update the code with the following:

//
Route::get('/', function () {
    return view('layouts.app');
});
Route::prefix('admin')->group(function() {
    Route::get('/login', 'Auth\[email protected]')->name('admin.login');
    Route::post('/login', 'Auth\[email protected]')->name('admin.login.submit');
    Route::get('/home', '[email protected]')->name('admin.home');
});
//

Step 11: Set up the Exception Handler

To set up the exception handler, go to app/Exceptions/Handler.php and update the code with the following:

//
use Illuminate\Auth\AuthenticationException;
//
//
protected $dontReport = [
     \Illuminate\Auth\AuthenticationException::class,
     \Illuminate\Auth\Access\AuthorizationException::class,
     \Symfony\Component\HttpKernel\Exception\HttpException::class,
     \Illuminate\Database\Eloquent\ModelNotFoundException::class,
     \Illuminate\Session\TokenMismatchException::class,
     \Illuminate\Validation\ValidationException::class,
];
//
//
public function render($request, Exception $exception)
{
    return parent::render($request, $exception);
}
    /**
     * Convert an authentication exception into an unauthenticated response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Auth\AuthenticationException  $exception
     * @return \Illuminate\Http\Response
     */
 protected function unauthenticated($request, AuthenticationException $exception)
 {
    if ($request->expectsJson()) {
     return response()->json(['error' => 'Unauthenticated.'],401);
    }
     $guard = array_get($exception->guards(), 0);
      switch ($guard) {
        case 'admin': $login = 'admin.login';
        break;
        default: $login = 'login';
        break;
      }
        return redirect()->guest(route($login));
  }

Step 12: Set up Middleware for Redirection

To set up the middleware for redirection after authentication, go to app/Http/Middleware/RedirectIfAuthenticated.php and update the code with the following:

//
public function handle($request, Closure $next, $guard = null)
{
        switch ($guard) {
            case 'admin' :
                if (Auth::guard($guard)->check()) {
                    return redirect()->route('admin.home');
                }
                break;
            default:
                if (Auth::guard($guard)->check()) {
                    return redirect()->route('home');
                }
                break;
        }
     return $next($request);
}
//

Step 12: Set up Authentication Configuration

To set up the authentication configuration, go to config/auth.php and update the code with the following:

//
'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
'admins' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ],
//
//
'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
        'admin-api' => [
            'driver' => 'token',
            'provider' => 'admins',
        ],
    ],
//
//
'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
       'admins' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ],
    ],
//
//
'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
        'admins' => [
            'provider' => 'admins',
            'table' => 'password_resets',
            'expire' => 15,
        ],
    ],

Step 13: Set up Database Migration Default String Lenth

To set up the default string length for the database migration, go to app/Providers/AppServiceProvider.php and update the code with the following:

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;

//

public function boot(){
    Schema::defaultStringLength(191);
}

Step 14: Run the Migration

To run the migration, enter the command below:

php artisan migrate
Use tinker to input Admin login credentials:
php artisan tinker

$admin = new App\Admin
$admin->email = '[email protected]'
$admin->password = Hash::make(’admin-password’)
$admin->save()

Congratulations!

Hopefully, now you can easily setup Multiple Authentication in Laravel projects.