在JetStream微服务架构下,使用Passport OAuth2认证并结合Scope和RBAC(基于角色的访问控制)实现权限控制,可以按照以下步骤进行:
首先,确保你已经安装了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();
}
在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',
]);
}
创建角色(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']);
});
在Role
和Permission
模型中定义关系:
// Role.php
public function permissions()
{
return $this->belongsToMany(Permission::class);
}
// Permission.php
public function roles()
{
return $this->belongsToMany(Role::class);
}
在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);
}
创建一个中间件来检查用户是否具有特定权限:
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,
];
在路由中使用中间件和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');
});
使用Postman或其他工具测试OAuth2认证和权限控制,确保只有具有相应Scope和权限的用户可以访问受保护的资源。
通过以上步骤,你可以在JetStream微服务架构下使用Passport OAuth2认证,并结合Scope和RBAC实现细粒度的权限控制。这种方法不仅提高了系统的安全性,还增强了系统的灵活性和可维护性。