插件窝 干货文章 JetStream微服务架构下,如何使用Passport OAuth2认证并结合Scope和RBAC实现权限控制?

JetStream微服务架构下,如何使用Passport OAuth2认证并结合Scope和RBAC实现权限控制?

Permission Passport function table 883    来源:    2025-03-15

在JetStream微服务架构下,使用Passport OAuth2认证并结合Scope和RBAC(基于角色的访问控制)实现权限控制,可以按照以下步骤进行:

1. 安装和配置Passport OAuth2

首先,确保你已经安装了Laravel Passport,并配置了OAuth2认证。

composer require laravel/passport

运行迁移命令来创建Passport所需的表:

php artisan migrate

安装Passport并生成加密密钥:

php artisan passport:install

AuthServiceProvider中注册Passport路由:

use Laravel\Passport\Passport;

public function boot()
{
    $this->registerPolicies();

    Passport::routes();
}

2. 配置OAuth2 Scope

AuthServiceProvider中定义OAuth2 Scope:

use Laravel\Passport\Passport;

public function boot()
{
    $this->registerPolicies();

    Passport::routes();

    Passport::tokensCan([
        'read' => 'Read access',
        'write' => 'Write access',
        'delete' => 'Delete access',
    ]);
}

3. 创建RBAC模型和关系

创建角色(Role)和权限(Permission)模型,并定义它们之间的关系。

php artisan make:model Role -m
php artisan make:model Permission -m

在迁移文件中定义角色和权限表的结构:

// roles table migration
Schema::create('roles', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->timestamps();
});

// permissions table migration
Schema::create('permissions', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->timestamps();
});

// role_permission pivot table migration
Schema::create('role_permission', function (Blueprint $table) {
    $table->foreignId('role_id')->constrained();
    $table->foreignId('permission_id')->constrained();
    $table->primary(['role_id', 'permission_id']);
});

RolePermission模型中定义关系:

// Role.php
public function permissions()
{
    return $this->belongsToMany(Permission::class);
}

// Permission.php
public function roles()
{
    return $this->belongsToMany(Role::class);
}

4. 用户与角色的关联

User模型中定义与角色的关系:

// User.php
public function roles()
{
    return $this->belongsToMany(Role::class);
}

public function hasRole($role)
{
    return $this->roles->contains('name', $role);
}

public function hasPermission($permission)
{
    return $this->roles->flatMap->permissions->contains('name', $permission);
}

5. 中间件实现权限控制

创建一个中间件来检查用户是否具有特定权限:

php artisan make:middleware CheckPermission

在中间件中实现权限检查逻辑:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class CheckPermission
{
    public function handle($request, Closure $next, $permission)
    {
        if (!Auth::user()->hasPermission($permission)) {
            return response()->json(['error' => 'Unauthorized'], 403);
        }

        return $next($request);
    }
}

Kernel.php中注册中间件:

protected $routeMiddleware = [
    'permission' => \App\Http\Middleware\CheckPermission::class,
];

6. 路由中使用中间件和Scope

在路由中使用中间件和Scope来控制访问权限:

Route::middleware(['auth:api', 'scopes:read'])->group(function () {
    Route::get('/read-only', 'Controller@readOnly');
});

Route::middleware(['auth:api', 'permission:write'])->group(function () {
    Route::post('/write', 'Controller@write');
});

7. 测试和验证

使用Postman或其他工具测试OAuth2认证和权限控制,确保只有具有相应Scope和权限的用户可以访问受保护的资源。

总结

通过以上步骤,你可以在JetStream微服务架构下使用Passport OAuth2认证,并结合Scope和RBAC实现细粒度的权限控制。这种方法不仅提高了系统的安全性,还增强了系统的灵活性和可维护性。