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);
}
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!