繁体   English   中英

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

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

我想在不使用任何 package 的情况下在 Laravel-8 中实现模拟功能。

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

这是我的中间件:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM