📅  最后修改于: 2023-12-03 15:40:30.243000             🧑  作者: Mango
当使用 Laravel 开发应用程序时,我们通常需要通过身份验证(Auth)来保护我们的路由和功能。但是,在某些情况下,您需要更细粒度的控制来限制用户可以访问的内容。这时就需要使用Spate提供的权限控制功能。
Spatie 是一个流行的 Laravel 包,它提供了一些很好的功能来增强 Laravel 应用程序的安全性,包括一个优雅的权限系统。在本文中,我们将介绍如何使用 Spatie 来检查 Auth 用户是否在 Spatie 中具有权限。
在开始之前,我们需要通过 composer 将 Spatie 安装到我们的应用程序中。可以执行以下命令:
composer require spatie/laravel-permission
在检查身份验证用户是否有权限之前,我们需要定义权限。在 Spatie 中,您可以通过使用 Permission
模型来定义权限。该模型包含 name
和 guard_name
属性,前者是权限名称,后者是权限作用域(通常为 Web。
我们可以在 database/seeds/DatabaseSeeder.php
中创建一些权限,如下所示:
use Spatie\Permission\Models\Permission;
class DatabaseSeeder extends Seeder
{
public function run()
{
Permission::create(['name' => 'create post', 'guard_name' => 'web']);
Permission::create(['name' => 'update post', 'guard_name' => 'web']);
Permission::create(['name' => 'delete post', 'guard_name' => 'web']);
}
}
在我们将这些权限添加到数据库中之后,我们可以使用 $user->givePermissionTo('permission-name')
将特定用户分配给某个权限。例如:
$user = auth()->user();
if (!$user->hasPermissionTo('create post')) {
abort(403); // Unauthorized
}
Spatie 还提供了针对权限检查的中间件。而不是在我们自己的控制器或路由文件中实现权限检查,我们可以使用中间件来更好地将它们分离。
为了使用中间件,我们需要使用以下命令创建一个新的中间件类:
php artisan make:middleware CheckUserPermission
然后在 app/Http/Middleware/CheckUserPermission.php
中添加以下内容:
use Closure;
use Illuminate\Support\Facades\Auth;
class CheckUserPermission
{
public function handle($request, Closure $next, $permission)
{
$user = Auth::user();
if (!$user->hasPermissionTo($permission)) {
abort(403); // Unauthorized
}
return $next($request);
}
}
这个中间件将接受一个
permission` 参数,该参数将用作要检查的权限的名称。例如,在路由定义中,我们可以像这样使用它:
Route::get('/posts/create', function () {
return view('posts.create');
})
->middleware('auth')
->middleware('can:create post', 'web');
在这篇文章中,我们学习了如何使用 Spatie 来检查 Auth 用户是否在 Spatie 中具有权限。我们还介绍了如何通过中间件来更好地进行权限检查。希望这篇文章可以帮助你更好地掌握 Laravel 和 Spatie 的权限系统!