Laravel-8 中的 Auth::onceUsingID() 和 Auth::setUser() 有什么区别
What is difference between Auth::onceUsingID() and Auth::setUser() in Laravel-8
我想在 Laravel-8 中实现 Impersonate 功能而不使用任何包。
- 只有超级管理员可以使用此功能。
- 我使用 laravel 密室进行身份验证。
- 要访问模拟功能,用户应该是超级管理员。 (is_admin(布尔值)标志设置为用户 table)。
这是我的中间件:
<?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有没有实现自己的版本
我想在 Laravel-8 中实现 Impersonate 功能而不使用任何包。
- 只有超级管理员可以使用此功能。
- 我使用 laravel 密室进行身份验证。
- 要访问模拟功能,用户应该是超级管理员。 (is_admin(布尔值)标志设置为用户 table)。
这是我的中间件:
<?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有没有实现自己的版本