Laravelで他のユーザーになりたいときってありませんか?
他のユーザーから「私がやったらエラーが出るけど?」
「説明どおりにやっているのに正しく動かない!」などなど
自分では正しく動いてるのに、他の人はうまくできない!みたいなとき
その人に代わって操作できると便利ですよね。
バグを見つける助けにもなります。
自分では気が付かなかった不具合など見つけるのに役立ちます。
Laravelのログインしているユーザーを一時的に変更する方法です。
ただし、誰でも他のユーザーに成れてしまうと、ユーザー認証が意味のないものになってしまうのでSwichできるIPアドレスに制限をかけ、許可されたネットワーク接続した環境だけ許可します。
許可したユーザーだけ許可することもできそうですが今回はIP制限にします。
まずMiddlewareを作成します。
app/Http/Middleware/IPAuth.php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
class IPAuth
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$ip = \Request::ip();
$original_user = $request->session()->get("original_user");
$switch_user = $request->path();
// 許可するIP
$allow_ip = array_map('trim', explode(',', env('ALLOW_SWITCH_IP',"")));
if(in_array($ip, $allow_ip)){
// 誰がSwitchしたかわかるようにログを残す
Log::info("SwitchUser:".$original_user. "→". $switch_user);
return $next($request);
}
return redirect('/home');
}
}
カーネルのrootMiddlewareに追加します。
app/Http/Kernel.php
protected $routeMiddleware = [
....
....
'ip.auth' => \App\Http\Middleware\IPAuth::class,
];
コントローラを作成します
app/Http/Controllers/SwitchUserController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
use App\User;
class SwitchUserController extends Controller
{
/**
* SwitchUserController constructor.
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* ユーザー切り替え
*
* @param User $user
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function switch_user(User $user)
{
if ($user->id !== ($original = Auth::user()->id)) {
session()->put('original_user', $original);
auth()->login($user);
}
return redirect('/home');
}
/**
* オリジナルユーザーに復帰
*
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function revert()
{
auth()->loginUsingId(session()->get('original_user'));
session()->forget('original_user');
return redirect('/home');
}
}
ルーティングを追加
・・・
・・・
// Switch User
Route::prefix('switch_user')->middleware('ip.auth')->group(function () {
# Revert route...
Route::get('revert', 'SwitchUserController@revert');
# Impersonate route...
Route::get('{user}', 'SwitchUserController@switch_user');
});
・・・
・・・
環境変数に追加
環境変数に許可するIPを記述します、複数ある場合はカンマで区切って入れます。
.env
・・・
・・・
ALLOW_SWITCH_IP=127.0.0.1,192.168.33.10,192.168.33.20
・・・
・・・
これでURLに
https://XXXXX.jp/switch_user/1
でUserIDが1のユーザーにスイッチできます。
元のユーザーに戻るときは
https://XXXXX.jp/switch_user/revert
コメント