Laravelでユーザーを切り替える(偽装する!なりすまし!)

プログラミング
この記事は約6分で読めます。
記事内に広告が含まれます。

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

コメント

タイトルとURLをコピーしました