Introduction
Laravel is a powerful PHP framework that simplifies API development, and Passport provides a full OAuth2 server implementation for secure authentication. In this guide, we will explore how to protect Laravel APIs using Passport and implement RBAC to control user access based on roles and permissions.

Step 1: Installing Laravel Passport
First, install Laravel Passport via Composer:
composer require laravel/passportAfter installation, run the following commands to set up Passport:
php artisan migrate
php artisan passport:installThe passport:install command generates encryption keys and access tokens required for authentication.
Next, add the HasApiTokens trait to your User model:
use Laravel\Passport\HasApiTokens;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
}Then, register Passport’s routes in AuthServiceProvider.php:
use Laravel\Passport\Passport;
public function boot()
{
$this->registerPolicies();
Passport::routes();
}Finally, set the driver option in config/auth.php for API authentication:
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],Step 2: Creating API Authentication Routes
Define authentication routes in routes/api.php:
use App\Http\Controllers\AuthController;
Route::post('/register', [AuthController::class, 'register']);
Route::post('/login', [AuthController::class, 'login']);
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});Implementing Authentication in AuthController
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;
class AuthController extends Controller
{
public function register(Request $request)
{
$request->validate([
'name' => 'required',
'email' => 'required|email|unique:users',
'password' => 'required|min:6',
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
return response()->json(['token' => $user->createToken('API Token')->accessToken]);
}
public function login(Request $request)
{
if (Auth::attempt(['email' => $request->email, 'password' => $request->password])) {
return response()->json(['token' => Auth::user()->createToken('API Token')->accessToken]);
}
return response()->json(['error' => 'Unauthorized'], 401);
}
}Step 3: Implementing Role-Based Access Control (RBAC)
Step 3.1: Creating Migration and Models
Run the following command to create the roles and permissions tables:
php artisan make:migration create_roles_and_permissions_tablesDefine the migration schema in database/migrations/{timestamp}_create_roles_and_permissions_tables.php:
Schema::create('roles', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
Schema::create('role_user', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->foreignId('role_id')->constrained()->onDelete('cascade');
$table->timestamps();
});Run the migration:
php artisan migrateStep 3.2: Defining Role Relationships in Models
Role Model
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
protected $fillable = ['name'];
public function users()
{
return $this->belongsToMany(User::class);
}
}User Model
class User extends Authenticatable
{
public function roles()
{
return $this->belongsToMany(Role::class);
}
public function hasRole($role)
{
return $this->roles()->where('name', $role)->exists();
}
}Step 3.3: Middleware for Role Authorization
Create a middleware to check user roles:
php artisan make:middleware RoleMiddlewareEdit RoleMiddleware.php:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class RoleMiddleware
{
public function handle(Request $request, Closure $next, $role)
{
if (!Auth::user() || !Auth::user()->hasRole($role)) {
return response()->json(['error' => 'Forbidden'], 403);
}
return $next($request);
}
}Register the middleware in Kernel.php:
protected $routeMiddleware = [
'role' => \App\Http\Middleware\RoleMiddleware::class,
];Step 3.4: Protecting API Routes
Modify routes/api.php to include RBAC:
Route::middleware(['auth:api', 'role:admin'])->group(function () {
Route::apiResource('/cars', CarController::class);
});Conclusion
Securing Laravel APIs with Passport ensures authenticated access, and implementing RBAC provides fine-grained control over user actions. By following this guide, you can effectively authenticate users and manage roles, enhancing the security of your Laravel applications.
For professional Laravel development and security solutions, check out Techliphant. Our experts can help you implement robust authentication and role-based access control in your Laravel projects, ensuring top-notch security and performance.

