filament安装权限插件
在laravel11里安装filament的权限插件: althinect/filament-spatie-roles-permissions 提供角色和权限的控制。
由于这个插件是基于spatie/laravel-permission的,所以先安装它。
composer require spatie/laravel-permission
安装成功后,在bootstrap\providers.php文件里添加:
return [
...
Spatie\Permission\PermissionServiceProvider::class,
];
执行命令,生成配置文件和迁移文件
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
执行迁移,创建5张权限表:role_has_permissions, model_has_roles, model_has_permissions, roles, permissions
php artisan migrate
在app\Models\User.php文件里添加:use HasRoles;
use Spatie\Permission\Traits\HasRoles;
...
class User extends Authenticatable implements FilamentUser
{
use HasFactory, Notifiable, HasRoles;
...
}
接下来开始安装角色和权限插件
composer require althinect/filament-spatie-roles-permissions
安装成功后,在app\Providers\Filament\AdminPanelProvider.php文件里追加这个插件
use Althinect\FilamentSpatieRolesPermissions\FilamentSpatieRolesPermissionsPlugin;
...
public function panel(Panel $panel): Panel
{
return $panel
->default()
...
->plugin(FilamentSpatieRolesPermissionsPlugin::make());
}
生成配置文件:
php artisan vendor:publish --tag="filament-spatie-roles-permissions-config" --force
注释配置文件里的
//'team_model' => \App\Models\Team::class
生成翻译文件
php artisan vendor:publish --tag="filament-spatie-roles-permissions-translations"
添加guards
'guards' => [
...
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
],
OK,到这里就安装成功了,那么让我们来看看怎么使用它
首先,如果没有创建过用户资源,那就创建它
php artisan make:filament-resource UserResource
在app\Filament\Resources\UserResource.php文件的form里添加roles选项
public static function form(Form $form): Form
{
return $form
->schema([
...
Forms\Components\Select::make('roles')->multiple()->relationship('roles', 'name')->preload()
]);
}
生成权限和策略
php artisan permissions:sync -P
在文件app\Providers\AppServiceProvider.php的boot方法里添加策略
use App\Models\User;
use App\Policies\UserPolicy;
use Illuminate\Support\Facades\Gate;
...
public function boot(): void
{
...
// 是否超级管理员
Gate::before(function (User $user, string $ability) {
return $user->isSuperAdmin() ? true : null;
});
// 是否有用户管理权限
Gate::policy(User::class, UserPolicy::class);
}
...
// User的Model类里可以定义一个验证是否管理员的方法
public function isSuperAdmin(): bool
{
$superAdminId = config('admin.SUPER_ADMIN_ID', 1);
return $this->id === $superAdminId;
}
登录后台,创建roles,选择对应的权限,然后编辑用户,勾选对应的roles,就可以实现权限控制了
如果想把角色和权限也加入到权限表里,进行控制,可以看到文档里是这样说的:
1,首先创建对应的模型
php artisan make:model Role
php artisan make:model Permission
2,生成权限和策略,可以看到数据表permissions里多了role和permissions的权限数据,和新建的2个策略文件:app\Policies\Role.php和app\Policies\PermissionPolicy.php
php artisan permissions:sync -P
3,修改策略文件 app\Policies\Role.php 和 app\Policies\PermissionPolicy.php 将原先的
App\Models\Role;
App\Models\Permission;
替换为
Spatie\Permission\Models\Role;
Spatie\Permission\Models\Permission;
<?php
namespace App\Policies;
use Illuminate\Auth\Access\Response;
use Spatie\Permission\Models\Permission;
use App\Models\User;
class PermissionPolicy
{
...
}
<?php
namespace App\Policies;
use Illuminate\Auth\Access\Response;
use Spatie\Permission\Models\Role;
use App\Models\User;
class RolePolicy
{
...
}
4,在文件app\Providers\AppServiceProvider.php的boot方法里添加策略
public function boot(): void
{
...
Gate::policy(\Spatie\Permission\Models\Permission::class, PermissionPolicy::class);
Gate::policy(\Spatie\Permission\Models\Role::class, RolePolicy::class);
}