What I have done so far.
I am trying to authenticate users and admin form user table and admin table respectively.
I am using the User model as provided by laravel out of the box and created exactly same for Admin.
I have added a guard key and provider key into auth.php

Guards

'guards' => [
    'user' =>[
        'driver' => 'session',
        'provider' => 'user',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admin',
    ],
],  

Providers

'providers' => [
    'user' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admin' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
],

Routes

Route::group(['middleware' => ['web']], function () {
    //Login Routes...
    Route::get('/admin/login','AdminAuth\AuthController@showLoginForm');
    Route::post('/admin/login','AdminAuth\AuthController@login');
    Route::get('/admin/logout','AdminAuth\AuthController@logout');

    // Registration Routes...
    Route::get('admin/register', 'AdminAuth\AuthController@showRegistrationForm');
    Route::post('admin/register', 'AdminAuth\AuthController@register');

    Route::get('/admin', 'AdminController@index');

});

I have created a directory called AuthAdmin where Laravel's default AuthController.php and PasswordController.php files are present. (Namespace Modified accordingly)

First of all in Laravel's docs mentioned that how to specify custom guard while authenticating like this which isn't working.
enter image description here

There's another method mentioned in laravel's docs to use a guard which is not working too.

enter image description here

It would be very helpful if someone could resolve the issues and and correct me if I am wrong.

upvote
  flag
Laravel fixed a bug in version 5.2.6. protected $guard = 'guard_name' can be used now. – imrealashu
upvote
  flag
awesome work @imrealashu - this is EXACTLY what i've been looking for :) – Zabs
upvote
  flag
Glad I could help :) – imrealashu
upvote
  flag
Pretty cool stuff. Got it to work with Laravel 5.4. Thanks ! – JazZ

3 Answers 11

up vote 172 down vote accepted

After lots of digging and lots of questions & answers I have finally managed to work Laravel 5.2 Multi Auth with two table, So I'm writing Answer of my own Question.

How to implement Multi Auth in Larvel 5.2

As Mentioned above. Two table admin and users

Laravel 5.2 has a new artisan command.

php artisan make:auth

it will generate basic login/register route, view and controller for user table.

Make a admin table as users table for simplicity.

Controller For Admin
app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController
(note: I just copied these files from app/Http/Controllers/Auth/AuthController here)

config/auth.php

//Authenticating guards
'guards' => [
    'user' =>[
        'driver' => 'session',
        'provider' => 'user',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admin',
    ],
],  

//User Providers
'providers' => [
    'user' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admin' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
],  

//Resetting Password  
'passwords' => [
    'clients' => [
        'provider' => 'client',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
    'admins' => [
        'provider' => 'admin',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
],  

route.php

Route::group(['middleware' => ['web']], function () {
    //Login Routes...
    Route::get('/admin/login','AdminAuth\AuthController@showLoginForm');
    Route::post('/admin/login','AdminAuth\AuthController@login');
    Route::get('/admin/logout','AdminAuth\AuthController@logout');

    // Registration Routes...
    Route::get('admin/register', 'AdminAuth\AuthController@showRegistrationForm');
    Route::post('admin/register', 'AdminAuth\AuthController@register');

    Route::get('/admin', 'AdminController@index');

});  

AdminAuth/AuthController.php

Add two methods and specify $redirectTo and $guard

protected $redirectTo = '/admin';
protected $guard = 'admin';
public function showLoginForm()
{
    if (view()->exists('auth.authenticate')) {
        return view('auth.authenticate');
    }

    return view('admin.auth.login');
}
public function showRegistrationForm()
{
    return view('admin.auth.register');
}  

it will help you to open another login form for admin

creating a middleware for admin

class RedirectIfNotAdmin
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @param  string|null  $guard
 * @return mixed
 */
public function handle($request, Closure $next, $guard = 'admin')
{
    if (!Auth::guard($guard)->check()) {
        return redirect('/');
    }

    return $next($request);
}

}

register middleware in kernel.php

 protected $routeMiddleware = [
    'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class,
];

use this middleware in AdminController e.g.,

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;

class AdminController extends Controller
{
    public function __construct(){
        $this->middleware('admin');
   }
public function index(){
        return view('admin.dashboard');
    }
}

That's all needed to make it working and also to get json of authenticated admin use
Auth::guard('admin')->user()

Edit - 1
We can access authenticated user directly using
Auth::user() but if you have two authentication table then you have to use

Auth::guard('guard_name')->user()  

for logout

Auth::guard('guard_name')->user()->logout()

for authenticated user json

Auth::guard('guard_name')->user()  

Edit 2

Now you can download Laravel 5.2 Multiauth implemented Project http://imrealashu.in/code/laravel/multi-auth-with-laravel-5-2-2/

upvote
  flag
thanks a lot man, this was what i was searching for, it worked with a litle bit of modification. thanks a lot +1 for Q and +1 for Ans, wish i could +1 more. thanks a lot.. – rummykhan
upvote
  flag
@imrealashu, As I have created project as per your answer. But it generates error of multiple classes with same name. So what about that? If I changes class name for admin auth, then where I need to do changes? – Akshay Vaghasiya
upvote
  flag
I'd recommend you to separate two auth controllers with different folder. e.g., Admin\AuthController.php and Users\AuthController.php or you can keep default Auth\AuthController.php intact. and make sure to change the namespace accordingly. – imrealashu
upvote
  flag
@imrealashu, as I have changed namespace for AdminAuth/AuthController, problem is solved. But I have username for admin and email for user. So what changes need to apply for authentication while login admin? And even I can't get login. – Akshay Vaghasiya
1 upvote
  flag
can you please also explain how to "Reset Password" for admin guard. – Shoaib Rehan
upvote
  flag
yeas sure, give me some time. I'll update the answer. – imrealashu
1 upvote
  flag
Thanks for the excellent explanation was very useful to me everything. To use the middleware guest, change the RedirectIfAuthenticated.php file the following line: Original: if (Auth :: guard ($ guard) -> check ()) { return redirect ('/'); } After the change: if (Auth :: guard ('yourcustomguard') -> check () || Auth :: check ()) { return redirect ('/'); } – Cristian Meza
upvote
  flag
I am trying to make login for admin and user. It works for me with admin but it fails when I try to login user. Any idea why? – Aryan
upvote
  flag
@Aryan will you be able to share some of your code ? – imrealashu
upvote
  flag
@CristianMeza Glad I could help and appreciate you for noticing me this one you have mentioned above. I will update my answer. – imrealashu
upvote
  flag
@imrealashu Using multi auth is it possible to login both admin and user in different tab in same bowser? – Kiren Siva
upvote
  flag
@KirenSiva yeah, it is possible. I have faced some problem in local server like when user tries to log in and if admin is already logged in then admin gets logged out automatically. But when deployed on live server it works fine. – imrealashu
upvote
  flag
Hello again friends, I have been presented a problem. The problem is that the routes Auth default user are visible although this log with the admin. Example: I'm logged in as administrator with the route admins/login, but even I can see the path /login of the default user of Laravel and vice versa. Then as I can protect the routes are a user or another when any this log?. Greetings from Chile – Cristian Meza
upvote
  flag
Thanks for your answer! But could you please tell me how should I write the Admin/AuthController@register function? Thanks! – user5779223
upvote
  flag
I am just wondering, why did have to spend so much time doing this. Laravel is supposed to be so easy ... [wink, wink] – Jeffz
1 upvote
  flag
@Jeffz its just because of bad documentation and no working examples on multi-auth.. we expect good documentation and yeah the new cool features on this 5.3 update. – imrealashu
upvote
  flag
Can also confirm that this works beautifully on Laravel 5.3! Thanks for the fantastic guide mate.This is probably the only bit of the Laravel documentation that's lacking, and oddly enough if you require it, it's probably one of the most important parts of the entire application – DLMousey
upvote
  flag
Hello I have done Multi Auth same way as describe above but every time when I try to login using admin/login after login it redirect to front end side login page say /login not in admin/dashboard please help for same – Naresh Ramoliya
upvote
  flag
did you see this post ? I've also included a multi auth implemented repo link there. – imrealashu
upvote
  flag
I have one question, does it allow to login two different type of users on same browser but on different tabs. i.e in one browser tab simple user is logged in and in another tab admin user. Is it possible? – Parth Vora
upvote
  flag
@imrealashu, I have followed all step as per you but logout is not working because Guard was not updated it hold default value. Please tell me – Amit Maan
upvote
  flag
I made this setup and this works perfectly fine for me but what I want to ask is that how can stop the auto login right after sign up, as I'm putting the register user option inside the Admin and when I as an Admin register some user it makes that user logged in as well then Admin becomes logged in inside the user. So, I think by changing this feature of auto login my problem will be solved, please suggest how to fix this. – Vikas Meena
upvote
  flag
@VikasMeena For that you need to override register method of RegisterUser trait. Because in register method it logs in user once they complete registration. – imrealashu

In case this helps anyone, and this may just be due to my lack of understanding of middleware, here's what I had to do to get this working (in addition to the steps taken by @imrealashu)...

In route.php:

Route::get('/admin', [
  'middleware' => 'admin',
  'uses' => 'AdminController@index'
]);

This is in the web middleware group. Before this I tried putting it in a separate admin middleware group and even in an auth:admin group but this didn't work, it only worked for me when I specified the middleware as admin on the route itself. I have no idea why this is but I hope it saves others from pulling their hair out like I did.

upvote
  flag
I downloaded your multi auth zip file replaced with ezisting project files then when I migrate my DB this error show..[Symfony\Component\Console\Exception\RuntimeException] Not enough arguments (missing: "name"). – G Naga Subrahmanyam
upvote
  flag
Actually for me admin is logging in but not redirected to admin. After doing this it works can you please tell why's so? I got to register other routes as is it possible with Route::group(['middleware' => ['admin']], function () { //Admin Routes... }); cause it's not working for me – Akash Rajput

In Laravel there are many Admin panel generator packages available. I prefer Voyager Admin. Installing them easy and breeze. It may save you ton of code. You just need to understand how it works. Don't reinvent the wheel.

Voyager - The Missing Laravel Admin

A Laravel application with Gentelella bootstrap admin tempalte.

Not the answer you're looking for? Browse other questions tagged or ask your own question.