Multiple Users Types (not roles) laravel passport authentication

Viewed 210

I am working on an application which have 4 areas (admin, service provider, customer, anonymous/guest) in Angular. For backend in Laravel I am using Passport authentication to secure access to my API only for frontend or mobile app of the company. After successful installation and tests of Laravel Passport I decided to define guards for each area.

    'guards' => [
        'customer' => [
            'driver' => 'passport',
            'provider' => 'customers',
        ],

        'ga' => [
            'driver' => 'passport',
            'provider' => 'globaladmin'
        ],

        'spa' => [
            'driver' => 'passport',
            'provider' => 'serviceprovideradmin'
        ],
    ],
    'providers' => [
        
        'customers' => [
            'driver' => 'eloquent',
            'model' => App\Models\Customer::class,
        ],
        'globaladmin' => [
            'driver' => 'eloquent',
            'model' => App\models\GlobalAdmin::class,
        ],
        'serviceprovideradmin' => [
            'driver' => 'eloquent',
            'model' => App\models\ServiceProviderAdmin::class,
        ],
    ],

In Kernel.php

   protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        ...
   ];

Routes:

Route::post('customers/login', 'App\Http\Controllers\CustomerController@login');
Route::post('ga/login', 'App\Http\Controllers\GlobalAdminController@login');
Route::post('spa/login', 'App\Http\Controllers\ServiceProviderAdminController@login');

Route::middleware('auth:customer')->get('/customers', 'App\Http\Controllers\CustomerController@index');
Route::middleware('auth:ga')->get('/ga', 'App\Http\Controllers\GlobalAdminController@index');
Route::middleware('auth:spa')->get('/spa', 'App\Http\Controllers\ServiceProviderAdminController@index');

Models: (Customer, GlobalAdmin, ServiceProviderAdmin, all have same copy of Model class User shipped with laravel)

class Customer extends Authenticatable
{
    use HasFactory, Notifiable, HasApiTokens;
    ....
}
class GlobalAdmin extends Authenticatable
{
    use HasFactory, Notifiable, HasApiTokens;
    ....
}
class ServiceProviderAdmin extends Authenticatable
{
    use HasFactory, Notifiable, HasApiTokens;
    ....
}

Problem: I am able to logging in with customer, admin, service provider accounts, and receiving tokens. For test purpose I am using postman. After having token against customer, if I use same token for Admin or ServiceProvider api retreives the data, which should not be. My understanding is guards should protect endpoints based on the type of user's token. Please suggest how I can achieve this?

Thanks in advance :)

0 Answers
Related