Multiple authentication in Laravel 5.6

Multiple authentication is very important in the large application of laravel 5.6. If you work on huge web application then you most favor to different tables, like you always prefer "users" table for site user registration and "admins" table for the admin user.And that way make strong security.  

Authentication is the process of recognizing user credentials. In web applications, authentication is managed by sessions which take the input parameters such as email, username, and password, for user identification. If these parameters match, the user is said to be authenticated. Following command to perform authentication,

php artisan make:auth

To make admins with authentication then you can do easily by the following step.

Step 1: Laravel Setup.

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

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 

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 an 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\AdminLoginController@showLoginForm')->name('admin.login');
    Route::post('/login', 'Auth\AdminLoginController@login')->name('admin.login.submit');
    Route::get('/home', 'AdminController@index')->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 13: 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 14: Set up Database Migration Default String Length

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 15: 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 = 'admin@app.com'
$admin->password = Hash::make(’admin-password’)
$admin->save()

Congratulations!

Now you can easily setup Multiple Authentication in Laravel projects.