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