Multiauth not working properly using guard for user login

31 Views Asked by At

I created multi authentication in Laravel for user and admin through same table

User Migration :

<?php

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

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->integer('is_admin')->default(0);
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

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

Admin Login controller:

<?php

namespace App\Http\Controllers\Admin;
use Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Foundation\Auth\AuthenticatesUsers;


class LoginController extends Controller
{
    use AuthenticatesUsers;
    //
    protected $redirectTo = '/admin/dashboard';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
   
    public function __construct()
    {
        $this->middleware('guest:admin')->except('logout');
    }

    /**
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function showLoginForm()
    {
        return view('admin.pages.login');
    }

    public function login(Request $request)
    {
    $this->validate($request, [
        'email'   => 'required|email',
        'password' => 'required|min:6',
        'remember_me'=>'nullable'
    ]);
    $request->merge(['user_type'=>'1']);
    if (Auth::guard('admin')->attempt([
        'email' => $request->email,
        'password' => $request->password,'is_admin' => $request->user_type
    ], $request->input('remember_me'))) {
        return redirect()->intended(route('admin.dashboard'));
    }
    else{
        return back()->withErrors(['message'=>'Username or Password is Invalid'])->withInput($request->all());
    }
    //return back()->withInput($request->only('email', 'remember'));
    }
 

public function logout(Request $request)
    {
    Auth::guard('admin')->logout();
    $request->session()->invalidate();
    return redirect()->route('admin.login');
    }
}

Login Controller for User :

<?php

namespace App\Http\Controllers;
use Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Foundation\Auth\AuthenticatesUsers;


class LoginController extends Controller
{
    use AuthenticatesUsers;
    //
    protected $redirectTo = '/user/dashboard';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
   
    public function __construct()
    {
        //$this->middleware('guest:web')->except('logout');
       // $this->middleware('guest', ['except' => 'logout']);
       //$this->middleware('guest:web')->except('logout');
    }

    /**
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function showLoginForm()
    { 
        return view('pages.login');
    }

    public function login(Request $request)
    {
        $this->validate($request, [
            'email'   => 'required|email',
            'password' => 'required|min:6',
            'remember_me'=>'nullable'
        ]);
        $request->merge(['user_type'=>'0']);
        if (Auth::guard('web')->attempt([
            'email' => $request->email,
            'password' => $request->password,'is_admin' => $request->user_type
        ], $request->input('remember_me'))) {
            return redirect()->intended(route('web.dashboard'));
        }
        else{
            return back()->withErrors(['message'=>'Username or Password is Invalid'])->withInput($request->all());
        }
        //return back()->withInput($request->only('email', 'remember'));
    }
 

    public function logout(Request $request)
    {
        Auth::guard('web')->logout();
        $request->session()->invalidate();
        return redirect()->route('user.login-show');
    }

    public function dashboard()
    {
        $this->data['page_js'] = ''; // ['_admin/plugins/raphael/raphael.min.js','_admin/plugins/morrisjs/morris.js'];
        $this->data['userData'] = Auth::guard('web')->user();
        $this->data['title'] = 'User Dashboard';
        return view('pages.dashboard', $this->data);
    }
}

Route:

Route::get('/admin', 'Admin\LoginController@showLoginForm')->name('admin.login');
Route::get('/login', 'LoginController@showLoginForm')->name('login-show');
Route::group(['prefix' => 'admin'], function () {
    Route::get('login', 'Admin\LoginController@showLoginForm')->name('admin-login-show');
    Route::post('login', 'Admin\LoginController@login')->name('admin.login.post');
    Route::group(['middleware' => ['auth:admin', 'prevent-back-history']], function () {
        Route::get('/dashboard', 'Admin\AdminController@dashboard')->name('admin.dashboard');
    });
    Route::post('logout', 'Admin\LoginController@logout')->name('admin.logout');
});

Route::group(['prefix' => 'user'], function () {
    Route::get('login', 'LoginController@showLoginForm')->name('user.login-show');
    Route::post('login', 'LoginController@login')->name('login.post');
    Route::group(['middleware' => ['auth:web', 'prevent-back-history']], function () {
        Route::get('/dashboard', 'LoginController@dashboard')->name('web.dashboard');
    });
    Route::post('logout', 'LoginController@logout')->name('logout');
});

Config/auth.php

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],
        'admin' => [
            'driver' => 'session',
            'provider' => 'admin',
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | User Providers
    |--------------------------------------------------------------------------
    |
    | All authentication drivers have a user provider. This defines how the
    | users are actually retrieved out of your database or other storage
    | mechanisms used by this application to persist your user's data.
    |
    | If you have multiple user tables or models you may configure multiple
    | sources which represent each model / table. These sources may then
    | be assigned to any extra authentication guards you have defined.
    |
    | Supported: "database", "eloquent"
    |
    */

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


        // 'users' => [

RedirectIfAuthenticated:

<?php

namespace App\Http\Middleware;

use App\Providers\RouteServiceProvider;
use Closure;
use Illuminate\Support\Facades\Auth;

class RedirectIfAuthenticated
{
    /**
     * 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 = null)
    {
        switch ($guard) {
          
            case 'admin':
              if (Auth::guard($guard)->check()) {
                return redirect()->route('admin.dashboard');
              }

            case 'web':
              if (Auth::guard($guard)->check()) { 
                return redirect()->route('web.dashboard');
              }
               
            default:    
              if (Auth::guard($guard)->check()) { 
               return redirect('/');
              }
              break;
        }
           return $next($request);
    }
}

Middleware (Authenticate.php)

<?php

namespace App\Http\Middleware;

use Illuminate\Auth\Middleware\Authenticate as Middleware;
use Route;
class Authenticate extends Middleware
{
    /**
     * Get the path the user should be redirected to when they are not authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return string|null
     */
    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            if(Route::is('admin.*')){
             return route('admin-login-show');
            }
            return route('user.login-show');
        }

    }
}

Here login for both admin and user is working, but in user login i have this route http://localhost:8000/user/login for login form if i login then it is redirected to http://localhost:8000/user/dashboard this route but when i access http://localhost:8000/user/login login page is still shown but i want it to redirect to http://localhost:8000/user/dashboard page, but this functionality is working for admin case.

Any solution Thanks

0

There are 0 best solutions below