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

标签 php laravel authentication impersonation

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

  • 只有 super 管理员才能使用此功能。
  • 我使用 laravel sainttum 进行身份验证。
  • 要访问模拟功能,用户应该是 super 管理员。 (is_admin(boolean) 标志已设置到用户表中)。

这是我的中间件:

<?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 是否实现了自己的版本。

关于php - Laravel-8 中 Auth::onceUsingID() 和 Auth::setUser() 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70493957/

相关文章:

php - 为什么我不能将 php time() 用于时间戳列?

php - (2/2) ErrorException stdClass 类的对象无法在 laravel 5 中转换为 int

javascript - 身份验证 - asp.net ajax javascript 调用 wcf

authentication - Kerberos - AES-256 Keytab 不起作用

java - php : reading json arraylist and saving data in mysql?

javascript - 要在此处添加什么 js 代码以获得平滑的滚动?

php - 如何在 CakePHP2 中缓存静态内容(css、图像、js 文件)?

php - Eloquent 查询构建器替换 and

laravel - 从 Eloquent 集合中仅提取原始 id

java - 在 JDBCRealm 中使用带有散列密码的 tomcat 基本/摘要身份验证的方法?