laravellaravel-5laravel-authorization

Can Anyone Explain Laravel 5.2 Multi Auth with Example


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 the 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, Laravel's docs mentioned how to specify a 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 beneficial if someone could resolve the issues and correct me if I am wrong.


Solution

  • 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 Laravel 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.,

    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/