这是我寻求的解决方案。结果比最初预期的要大一点。它似乎和我们使用 Tymondesigns/jwt-auth 和 Rickycezar/laravel-jwt-impersonate 时一样好。我对响应使用相同的结构,因此前端不需要进行任何更改。
迁移
public function up()
{
Schema::create('impersonations', function (Blueprint $table) {
$table->id();
$table->bigInteger('personal_access_token_id')->unsigned();
$table->bigInteger('user_id')->unsigned();
$table->timestamps();
$table->foreign('personal_access_token_id')->references('id')->on('personal_access_tokens')->cascadeOnDelete();
$table->foreign('user_id')->references('id')->on('users')->cascadeOnDelete();
});
}
User模型获取这三个函数
public function canImpersonate()
{
return $this->is_superadmin;
}
public function canBeImpersonated()
{
return !$this->is_superadmin;
}
public function isImpersonated() {
$token = $this->currentAccessToken();
return $token->name == 'IMPERSONATION token';
}
模拟功能。
把它放在任何有意义的地方。对我来说,它在我的超级管理员控制器中
public function impersonate($userId)
{
$impersonator = auth()->user();
$persona = User::find($userId);
// Check if persona user exists, can be impersonated and if the impersonator has the right to do so.
if (!$persona || !$persona->canBeImpersonated() || !$impersonator->canImpersonate()) {
return false;
}
// Create new token for persona
$personaToken = $persona->createToken('IMPERSONATION token');
// Save impersonator and persona token references
$impersonation = new Impersonation();
$impersonation->user_id = $impersonator->id;
$impersonation->personal_access_token_id = $personaToken->accessToken->id;
$impersonation->save();
// Log out impersonator
$impersonator->currentAccessToken()->delete();
$response = [
"requested_id" => $userId,
"persona" => $persona,
"impersonator" => $impersonator,
"token" => $personaToken->plainTextToken
];
return response()->json(['data' => $response], 200);
}
离开假冒
public function leaveImpersonate()
{
// Get impersonated user
$impersonatedUser = auth()->user();
// Find the impersonating user
$currentAccessToken = $impersonatedUser->currentAccessToken();
$impersonation = Impersonation::where('personal_access_token_id', $currentAccessToken->id)->first();
$impersonator = User::find($impersonation->user_id);
$impersonatorToken = $impersonator->createToken('API token')->plainTextToken;
// Logout impersonated user
$impersonatedUser->currentAccessToken()->delete();
$response = [
"requested_id" => $impersonator->id,
"persona" => $impersonator,
"token" => $impersonatorToken,
];
return response()->json(['data' => $response], 200);
}