
本文介绍如何在 Laravel 中使用 Sanctum 实现可选认证,允许同一路由既能被游客访问,也能被已登录用户访问。核心思路是检查请求中是否存在 Token,若存在则尝试通过 Sanctum 认证守卫获取用户并设置为当前用户,从而实现用户登录状态的判断。无需使用 auth:sanctum 中间件,即可根据请求头是否存在 Token 来判断用户是否已认证。
在某些场景下,我们需要创建一个可以被游客和已登录用户访问的路由。例如,一个展示文章详情的页面,游客可以浏览,登录用户可以查看更多信息或进行评论。使用 Laravel Sanctum,我们可以很容易地实现这种可选认证。
关键在于,我们不能简单地使用 auth:sanctum 中间件,因为这会强制要求所有访问者都必须提供有效的 API Token。相反,我们需要在路由逻辑中手动检查 Token 的存在性,并尝试进行认证。
以下是实现此功能的步骤:
移除 auth:sanctum 中间件。 确保路由定义中没有使用 auth:sanctum 中间件。
在路由处理函数中检查 Token。 使用 request()->bearerToken() 检查请求头中是否存在 Token。如果存在,则尝试使用 Auth::guard('sanctum')->user() 获取已认证的用户,并使用 Auth::setUser($user) 将其设置为当前用户。
下面是一个示例代码:
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Auth;
Route::get('optional-auth', function () {
if (request()->bearerToken() && $user = Auth::guard('sanctum')->user()) {
Auth::setUser($user);
}
return Auth::check(); // false for guest users, true if valid token present
});代码解释:
示例用法:
注意事项:
总结:
通过在路由处理函数中手动检查 Token 的存在性并进行认证,我们可以轻松实现 Laravel Sanctum 的可选认证。这使得我们可以创建灵活的 API 接口,允许游客和已登录用户访问相同的路由,并根据用户的认证状态提供不同的体验。这种方法避免了强制使用 auth:sanctum 中间件带来的限制,提供了更大的灵活性和控制权。
以上就是Laravel Sanctum 可选认证实现:允许游客和登录用户访问同一路由的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号