Laravel Sanctum 的 abilities 是动词+资源的细粒度权限标签(如 'posts:read'),创建 Token 时通过 createToken() 第二参数数组设定,校验用 $user->tokenCan() 方法。

Laravel Sanctum 的 abilities 是用于定义 Token 细粒度操作权限的核心机制,不是开关式角色(如“admin”或“user”),而是动词+资源的组合标签,比如 'posts:read'、'orders:delete',由你自主设计语义。
abilities 的设置方式
调用 createToken() 时传入第二个参数(数组),即可为该 Token 分配一组能力:
$token = $user->createToken('mobile-app', ['posts:read', 'comments:write'])->plainTextToken;这个 $token 后续在请求中携带(Authorization: Bearer xxx),Sanctum 会在认证后将 abilities 存入 $request->user()->currentAccessToken->abilities,供后续校验使用。
注意:
abilities字段存于personal_access_tokens表的abilities列(TEXT 类型,JSON 编码数组),数据库写入前已自动序列化。
如何校验 abilities 是否具备某项权限
Sanctum 提供了两个便捷方法:
大模型 Token 成本节约工具。在请求到达大模型之前自动压缩 prompt 和上下文,减少 60-95% 的 token 消耗,直接降低 API 成本。支持 Claude/OpenAI/Gemini 等主流模型,提供代理模式、CLI 包装、Python SDK 和 MCP Server 四种接入方式。内置一键安...
$user->tokenCan('posts:read')
检查当前 token(即currentAccessToken)是否包含指定 ability。$request->user()->can('posts:read')
不推荐直接用于 abilities 校验——这是 Laravel Gate 的接口,需额外注册Gate::define()才能联动,和 Sanctum 的 abilities 无默认绑定。
✅ 推荐做法是直接用 tokenCan(),例如在控制器或中间件中:
if (! $request->user()->tokenCan('users:export')) {
abort(403, 'Insufficient permissions');
}也可以一次校验多个:
if (! $request->user()->tokenCan('posts:read') || ! $request->user()->tokenCan('posts:publish')) {
abort(403);
}abilities 的实际设计建议
-
保持扁平、语义清晰:避免嵌套或模糊命名,如不用
'can_manage',而用'products:update'、'products:soft-delete'。 -
按动词+资源建模:
{resource}:{action}是主流实践(如 Laravel Nova、Jetstream 的风格)。 -
可组合、可叠加:一个 Token 可同时拥有
'invoices:read'和'invoices:download',互不冲突。 - 不强制全局唯一:不同用户、不同 Token 可重复使用相同 ability,权限控制逻辑在业务层判断。
注意事项
- abilities 仅在 token 创建时设定,之后不可修改(除非删除重发)。若需动态调整,应撤销旧 token 并签发新 token。
- Sanctum 不提供 abilities 的自动 RBAC 映射(比如“editor 角色 → 自动赋予 posts:write”),这部分需自行封装逻辑(如通过中间件 + 配置表或策略类)。
- 如果你希望 abilities 支持通配符(如
'posts:*'),Sanctum 原生不支持,需自定义校验逻辑(例如扩展tokenCan()方法)。
不需要复杂配置,也不依赖 Policy 或 Gate,abilities 就是一组字符串标签 + 一行 tokenCan() 调用。关键在于前期定义清楚,后期校验才不踩坑。

















