Laravel-8 中的 Auth::onceUsingID() 和 Auth::setUser() 有什么区别

What is difference between Auth::onceUsingID() and Auth::setUser() in Laravel-8

我想在 Laravel-8 中实现 Impersonate 功能而不使用任何包。

这是我的中间件:

<?php

namespace App\Http\Middleware;

use Closure;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class ImpersonateUser
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $impersonateId = $request->cookie('x-impersonate-id');
        if($request->user()->is_admin && $impersonateId) {
            $user = User::findOrFail($impersonateId);
            if($user->is_admin) {
                return response()->json(["message" => trans("You cannot impersonate an admin account.")], 400);
            }
            Auth::setUser($user);
        }
        return $next($request);
    }
}

我的路线文件:

    // Impersonate routes.
    Route::middleware(['auth:sanctum', 'impersonate'])->group(function () {
        // checklist routes
        Route::get('checklists', [ChecklistController::class, "index"]);
    });

使用 Auth::setUser($user) 是安全的还是我必须使用 Auth::onceUsingId($userId); ?

Auth::onceUsingId($userId); 无法使用 auth::sanctum 中间件。那么 Auth::setUser($user) 是否安全?

我只用 laravel 开发后端 API。(SPA)

在安全方面应该是一样的。 OnceUsingId() 在后台调用 setUser()

来自Illuminate\Auth\SessionGuard class

/**
 * Log the given user ID into the application without sessions or cookies.
 *
 * @param  mixed  $id
 * @return \Illuminate\Contracts\Auth\Authenticatable|false
 */
public function onceUsingId($id)
{
    if (! is_null($user = $this->provider->retrieveById($id))) {
        $this->setUser($user);

        return $user;
    }

    return false;
}

/**
 * Set the current user.
 *
 * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
 * @return $this
 */
public function setUser(AuthenticatableContract $user)
{
    $this->user = $user;

    $this->loggedOut = false;

    $this->fireAuthenticatedEvent($user);

    return $this;
}

虽然这两种方法都来自 SessionGuard。不知道Sanctum有没有实现自己的版本