Multiple authentication in Laravel 5.6
Multiple authentication is very important in the large application of laravel 5.6. If you work on huge web application then you most favor to different tables, like you always prefer "users" table for site user registration and "admins" table for the admin user.And that way make strong security.
Authentication is the process of recognizing user credentials. In web applications, authentication is managed by sessions which take the input parameters such as email, username, and password, for user identification. If these parameters match, the user is said to be authenticated. Following command to perform authentication,
php artisan make:auth
To make admins with authentication then you can do easily by the following step.
Step 1: Laravel Setup.
composer create-project --prefer-dist laravel/laravel project-name
Step 2: Database Configuration
Open the .env file and set database credentials in the file.
DB_DATABASE= database-name
DB_USERNAME= root
DB_PASSWORD= database-password
Step 3: Authentication
php artisan make:auth
Step 4: Setting up Models and Migrations
Create and set up the model and migration for Admin:
php artisan make:model Admin
To set up the model for Admin, go to app/Admin.php and update the code with the following:
/**
* Remove 'use Illuminate\Database\Eloquent\Model;'
*/
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Admin extends Authenticatable
{
use Notifiable;
// The authentication guard for admin
protected $guard = 'admin';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}
To set up the migration table for Admin, go to database/migration/***_create_admins_table.php and update the code with the following:
//
{
Schema::create('admins', function (Blueprint $table) {
$table->increments('id');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
//
Step 5: Set up the Admin Controller
To create the controller for the Admin, run the following command:
php artisan make:controller AdminController
To set up the controller, Go to app/Http/Controllers/AdminController.php and update the code with the following:
class AdminController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth:admin');
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('admin');
}
}
Step 6: Set up the Login Controller for an Admin User
To create the Login controller, run the following command:
php artisan make:controller Auth/AdminLoginController
To set up a login controller, go to app/Http/Controllers/Auth/AdminLoginController.php and update the code with the following:
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\Auth;
class AdminLoginController extends Controller
{
/**
* Show the application’s login form.
*
* @return \Illuminate\Http\Response
*/
public function showLoginForm()
{
return view(’auth.admin-login’);
}
protected function guard(){
return Auth::guard('admin');
}
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/admin/dashboard';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest:admin')->except('logout');
}
}
Step 7: Set up the Login Controller for a Normal User
To set up the login controller for a normal user, go to app/Http/Controllers/Auth/LoginController.php and update the code with the following:
//
/**
* Show the application's login form.
*
* @return \Illuminate\Http\Response
*/
public function showLoginForm()
{
return view('auth.login');
}
/
Step 8: Set up the Login View for Admin
To create and set up the login view for Admin, go to resources/views/auth/ and create a new file admin-login.blade.php. Copy the code in resources/views/auth/login.blade.php and paste in the new file. Now update the new file with the following:
//
<div class="card-header">{{ __('Admin Login') }}</div>
<div class="card-body">
<form method="POST" action="{{ route('admin.login.submit') }}">
//
Step 9: Set up the Home View for Admin
To create and set up the home view for Admin, go to resources/views/ and create a new file admin-home.blade.php. Copy the code in resources/views/home.blade.php and paste in the new file. Now update the new file with the following:
//
<div class="card">
<div class="card-header">Admin Dashboard</div>
//
Step 10: Set up the Web Application Routes
To set up the web routes for your application, go to routes/web.php and update the code with the following:
//
Route::get('/', function () {
return view('layouts.app');
});
Route::prefix('admin')->group(function() {
Route::get('/login', 'Auth\AdminLoginController@showLoginForm')->name('admin.login');
Route::post('/login', 'Auth\AdminLoginController@login')->name('admin.login.submit');
Route::get('/home', 'AdminController@index')->name('admin.home');
});
//
Step 11: Set up the Exception Handler
To set up the exception handler, go to app/Exceptions/Handler.php and update the code with the following:
//
use Illuminate\Auth\AuthenticationException;
//
//
protected $dontReport = [
\Illuminate\Auth\AuthenticationException::class,
\Illuminate\Auth\Access\AuthorizationException::class,
\Symfony\Component\HttpKernel\Exception\HttpException::class,
\Illuminate\Database\Eloquent\ModelNotFoundException::class,
\Illuminate\Session\TokenMismatchException::class,
\Illuminate\Validation\ValidationException::class,
];
//
//
public function render($request, Exception $exception)
{
return parent::render($request, $exception);
}
/**
* Convert an authentication exception into an unauthenticated response.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Auth\AuthenticationException $exception
* @return \Illuminate\Http\Response
*/
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'],401);
}
$guard = array_get($exception->guards(), 0);
switch ($guard) {
case 'admin': $login = 'admin.login';
break;
default: $login = 'login';
break;
}
return redirect()->guest(route($login));
}
Step 12: Set up Middleware for Redirection
To set up the middleware for redirection after authentication, go to app/Http/Middleware/RedirectIfAuthenticated.php and update the code with the following:
//
public function handle($request, Closure $next, $guard = null)
{
switch ($guard) {
case 'admin' :
if (Auth::guard($guard)->check()) {
return redirect()->route('admin.home');
}
break;
default:
if (Auth::guard($guard)->check()) {
return redirect()->route('home');
}
break;
}
return $next($request);
}
//
Step 13: Set up Authentication Configuration
To set up the authentication configuration, go to config/auth.php and update the code with the following:
//
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
//
//
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
'admin-api' => [
'driver' => 'token',
'provider' => 'admins',
],
],
//
//
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
],
//
//
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
],
'admins' => [
'provider' => 'admins',
'table' => 'password_resets',
'expire' => 15,
],
],
Step 14: Set up Database Migration Default String Length
To set up the default string length for the database migration, go to app/Providers/AppServiceProvider.php and update the code with the following:
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
//
public function boot()
{
Schema::defaultStringLength(191);
}
Step 15: Run the Migration
To run the migration, enter the command below:
php artisan migrate
Use tinker to input Admin login credentials:
php artisan tinker
$admin = new App\Admin
$admin->email = 'admin@app.com'
$admin->password = Hash::make(’admin-password’)
$admin->save()
Congratulations!
Now you can easily setup Multiple Authentication in Laravel projects.
Chad
15 Aug 2019
Instead of creating 3 different login controllers and 3 different login pages, you could just overwrite the attemptLogin() method in the login controller.