You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 8+Sanctum实现同一账号多登录的方案咨询

实现Laravel 8 + Sanctum同一用户多端登录的方案

你之前修改RedirectIfAuthenticated中间件的方向不对,这个中间件只负责已认证用户访问登录/注册页面时的跳转逻辑,和允许多次登录的权限控制无关,修改它导致401是因为破坏了原本的认证校验逻辑。

下面分两种常见场景给出具体实现方式:

场景1:基于Cookie会话的Web/SPA登录(对应你配置的SESSION_DRIVER=cookie)

Laravel Sanctum结合Cookie会话认证时,默认就支持同一用户在多设备/浏览器同时登录——每个设备会生成独立的会话,彼此不会互踢。如果你的应用之前出现互踢情况,按以下步骤调整:

  1. 移除会话限制代码
    检查LoginController或自定义登录逻辑中,是否存在强制销毁用户其他会话的代码,比如:
// 这类代码会销毁用户所有其他会话,导致单端登录,需要删除
auth()->user()->tokens()->delete();
// 或者会话相关的销毁逻辑
auth()->logoutOtherDevices($request->password);
  1. 确认Sanctum配置
    打开config/sanctum.php,确保stateful配置包含你的前端域名(SPA场景),无额外会话限制:
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
    '%s%s',
    'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
    env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : ''
))),
  1. 修复RedirectIfAuthenticated中间件
    将修改过的中间件恢复默认代码,避免401错误:
<?php

namespace App\Http\Middleware;

use App\Providers\RouteServiceProvider;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class RedirectIfAuthenticated
{
    public function handle(Request $request, Closure $next, ...$guards)
    {
        $guards = empty($guards) ? [null] : $guards;

        foreach ($guards as $guard) {
            if (Auth::guard($guard)->check()) {
                return redirect(RouteServiceProvider::HOME);
            }
        }

        return $next($request);
    }
}

场景2:基于API令牌的无状态登录

如果是给移动端/第三方服务提供API登录,使用Sanctum令牌认证,默认支持同一用户生成多个令牌,只需在登录时生成新令牌而不删除旧令牌:

  1. 修改登录接口逻辑
    示例代码如下,生成新令牌时保留原有令牌:
public function login(Request $request)
{
    $credentials = $request->validate([
        'email' => 'required|email',
        'password' => 'required',
    ]);

    if (!Auth::attempt($credentials)) {
        return response()->json(['message' => '无效的凭据'], 401);
    }

    // 生成新令牌,不删除旧令牌
    $token = $request->user()->createToken('api-token')->plainTextToken;

    return response()->json([
        'access_token' => $token,
        'token_type' => 'Bearer',
    ]);
}
  1. 令牌管理(可选)
    若需让用户查看/注销令牌,可添加对应接口:
// 获取用户所有令牌
public function getTokens(Request $request)
{
    return response()->json($request->user()->tokens);
}

// 注销指定令牌
public function revokeToken(Request $request, string $tokenId)
{
    $request->user()->tokens()->where('id', $tokenId)->delete();
    return response()->json(['message' => '令牌已注销']);
}

最后,恢复中间件默认代码后重新测试:会话认证场景下多设备登录应正常;API令牌场景下确保登录接口无错误权限校验逻辑,即可解决401问题。

内容的提问来源于stack exchange,提问作者Andrea Uberti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:52:32