Laravel Filament面板:如何展示并删除用户访问令牌?
解决Laravel Filament展示用户访问令牌并实现删除操作的问题
问题分析
你当前的代码存在两个核心问题:
- Repeater内部字段名错误:
tokens.name应改为name,因为Repeater已绑定到tokens关联,内部字段是相对于单个令牌对象的。 - 缺少
->relationship()方法:未明确告知Filament这是Eloquent关联关系,导致无法正确加载令牌数据。
另外,Laravel默认的访问令牌(Sanctum的PersonalAccessToken)的token字段为哈希存储,无法直接获取原始令牌值,仅能在创建时查看,因此展示时建议只显示末尾部分。
修正后的代码示例
在你的UserResource的form()方法中,替换为以下代码:
use Laravel\Sanctum\PersonalAccessToken; // ... 其他代码 Forms\Components\Repeater::make('tokens') ->relationship() // 关键:绑定到User模型的tokens关联 ->schema([ Forms\Components\TextInput::make('name') ->label('令牌名称') ->disabled(), // 禁用编辑,令牌名称创建后一般无需修改 Forms\Components\TextInput::make('token') ->label('令牌值') ->disabled() ->formatStateUsing(fn ($state) => $state ? substr($state, -10) : null) // 仅显示令牌最后10位 ->helperText('完整令牌仅在创建时可见,此处显示末尾10位'), Forms\Components\DateTimePicker::make('expires_at') ->label('过期时间') ->disabled(), Forms\Components\TextInput::make('abilities') ->label('权限') ->disabled() ->formatStateUsing(fn ($state) => is_array($state) ? implode(', ', $state) : $state), // 将权限数组转为字符串 ]) ->deletable() // 启用删除按钮 ->collapsible() // 允许折叠单个令牌项,优化界面 ->columnSpanFull()
确保User模型关联正确
确认你的User模型中已定义与PersonalAccessToken的关联:
// app/Models/User.php use Laravel\Sanctum\HasApiTokens; use Laravel\Sanctum\PersonalAccessToken; class User extends Authenticatable { use HasApiTokens; // 引入Sanctum的Trait // ... 其他代码 // 明确关联PersonalAccessToken模型(可选,若默认关联正常可省略) public function tokens() { return $this->hasMany(PersonalAccessToken::class); } }
额外说明
- 删除操作:Repeater的
->deletable()会自动生成删除按钮,点击后会从数据库中删除对应的令牌记录。 - 令牌值显示:由于数据库中存储的是哈希后的令牌,无法恢复原始值,所以只展示末尾部分是安全且合理的做法。
内容的提问来源于stack exchange,提问作者m.abdalla
相关产品推荐
相关产品推荐

