在 Laravel 框架中,权限继承通常是通过使用角色(Role)和权限(Permission)这两个模型来实现的。你可以通过以下步骤来设置权限继承:
首先,你需要使用 Laravel 的 Artisan 命令行工具来创建 Role 和 Permission 模型。运行以下命令:
php artisan make:model Role -m
php artisan make:model Permission -m
这将在 app
目录下创建 Role
和 Permission
模型,并在 database/migrations
目录下创建相应的迁移文件。
接下来,你需要在迁移文件中定义 Role 和 Permission 数据表的结构。打开 database/migrations
目录下的迁移文件,修改 up()
方法,添加以下内容:
public function up()
{
Schema::create('roles', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('display_name')->nullable();
$table->string('description')->nullable();
$table->timestamps();
});
Schema::create('permissions', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('display_name')->nullable();
$table->string('description')->nullable();
$table->timestamps();
});
}
然后运行 php artisan migrate
命令来创建数据表。
在 Role 和 Permission 模型中,你需要定义它们之间的多对多关系。打开 app/Models/Role.php
文件,添加以下方法:
public function permissions()
{
return $this->belongsToMany(Permission::class);
}
接下来,打开 app/Models/Permission.php
文件,添加以下方法:
public function roles()
{
return $this->belongsToMany(Role::class);
}
为了实现权限检查,你需要创建一个中间件。运行以下命令:
php artisan make:middleware CheckPermission
这将在 app/Http/Middleware
目录下创建 CheckPermission.php
文件。修改 handle()
方法,添加以下内容:
public function handle(Request $request, Closure $next, $permission)
{
if (Auth::guest() || !$request->user()->can($permission)) {
abort(403, 'Unauthorized action.');
}
return $next($request);
}
接下来,你需要在 app/Http/Kernel.php
文件中注册中间件。将以下代码添加到 $routeMiddleware
数组中:
'permission' => \App\Http\Middleware\CheckPermission::class,
现在你可以为角色分配权限。首先,你需要创建一些权限。运行以下命令:
php artisan make:permission CreatePost
php artisan make:permission EditPost
php artisan make:permission DeletePost
这将在 database/migrations
目录下创建新的迁移文件。修改这些文件,为每个权限定义 name
和 display_name
。
然后运行 php artisan migrate
命令来创建权限。
接下来,你可以为角色分配权限。例如,你可以将 CreatePost
权限分配给 author
角色。首先,获取角色和权限的实例:
$role = Role::where('name', 'author')->first();
$permission = Permission::where('name', 'create-post')->first();
然后,将权限分配给角色:
$role->givePermissionTo($permission);
最后,你可以在路由中使用 permission
中间件来保护需要权限的路由。例如,你可以在 routes/web.php
文件中添加以下代码:
Route::middleware(['permission:create-post'])->group(function () {
Route::post('/posts', [PostController::class, 'create']);
});
这样,只有具有 create-post
权限的用户才能访问 /posts
路由。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。