📌  相关文章
📜  检查 auth 用户是否在 spatie 中具有权限 (1)

📅  最后修改于: 2023-12-03 15:40:30.243000             🧑  作者: Mango

使用 Laravel 和 Spatie 来检查 Auth 用户是否具有权限

当使用 Laravel 开发应用程序时,我们通常需要通过身份验证(Auth)来保护我们的路由和功能。但是,在某些情况下,您需要更细粒度的控制来限制用户可以访问的内容。这时就需要使用Spate提供的权限控制功能。

Spatie 是一个流行的 Laravel 包,它提供了一些很好的功能来增强 Laravel 应用程序的安全性,包括一个优雅的权限系统。在本文中,我们将介绍如何使用 Spatie 来检查 Auth 用户是否在 Spatie 中具有权限。

安装 Spatie Package

在开始之前,我们需要通过 composer 将 Spatie 安装到我们的应用程序中。可以执行以下命令:

composer require spatie/laravel-permission
添加权限

在检查身份验证用户是否有权限之前,我们需要定义权限。在 Spatie 中,您可以通过使用 Permission 模型来定义权限。该模型包含 nameguard_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
}
Middleware

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 的权限系统!