Laravel Multi Authentication


Example

Laravel allows you to use multiple Authentication types with specific guards.

In laravel 5.3 multiple authentication is little different from Laravel 5.2

I will explain how to implement multiauthentication feature in 5.3

First you need two different user Model

cp App/User.php App/Admin.php

change class name to Admin and set namespace if you use models different. it should look like

App\Admin.php

<?php

namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class Admin extends Authenticatable
{
    use Notifiable;

    protected $fillable = ['name', 'email', 'password'];
    protected $hidden   = ['password', 'remember_token'];

}

Also you need create a migration for admin

php artisan make:migration create_admins_table

then edit migration file with contents of default user migration. Looks like this

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateAdminsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('admins', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');        
            $table->rememberToken();
            $table->timestamps();

            $table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('admins');
    }
}

edit config/auth.php

'guards'    => [
        'web'   => [
            'driver'   => 'session',
            'provider' => 'users',
        ],

        'api'   => [
            'driver'   => 'token',
            'provider' => 'users',
        ],
        //Add Admin Guard
        'admin' => [
            'driver'   => 'session',
            'provider' => 'admins',
        ],
    ],

and

'providers' => [
        'users'  => [
            'driver' => 'eloquent',
            'model'  => App\User::class,
        ],
        //Add Admins Provider
        'admins' => [
            'driver' => 'eloquent',
            'model'  => App\Admin::class,
        ],
    ],

Notice that we add two entry. one in guards variable one in providers variable.

And this is how you use the other guard then "web"

My App\Http\Controllers\Admin\LoginController

<?php

namespace App\Http\Controllers\Admin;

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

class AuthController extends Controller
{

    use AuthenticatesUsers;

    protected $guard = 'admin';

    protected $redirectTo = '/admin/';

    public function showLoginForm()
    {
        return view('admin.login');
    }

    protected function guard()
    {
        return Auth::guard($this->guard);
    }

}

this needs little explanation.

in a nutshell Auth::guard('admin') will allow you to use auth methods (such as login, logout, register etc.) with your admin guard.

For example

Auth::guard('admin')->login($user)

will search $user in admins table and login with the user while

Auth::login($user)

will works normally with users table. Default guard is specified in config/auth.php with defaults array. In fresh laravel it is "web" .

In controller you have to implement methods from AuthenticatesUsers to show your custom view paths. And you need implement other functions such as guard to use your new user guards.

In this example my admin login is admin/login.blade

And by implementing guard() function to return Auth::guard('admin') all AuthenticatesUsers trait methods works with "admin" guard.

In earlier versions of laravel, this is little different from 5.3

in 5.2 getGuard function returns $guard variable from class and main function (login) use it in

Auth::guard($guard)->attempt(...)

in 5.3 guard function returns whole Auth::guard() and main function use it like

$this->guard()->attempt(...)