feat:자동 재인증 미들웨어 추가
- AutoLoginViaRemember: 세션 만료 시 remember_token으로 자동 로그인 - HQ 소속/활성 상태 검증 - API 토큰 자동 재발급 - web 미들웨어 그룹에 등록 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
82
app/Http/Middleware/AutoLoginViaRemember.php
Normal file
82
app/Http/Middleware/AutoLoginViaRemember.php
Normal file
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use App\Services\ApiTokenService;
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class AutoLoginViaRemember
|
||||
{
|
||||
public function __construct(
|
||||
private readonly ApiTokenService $apiTokenService
|
||||
) {}
|
||||
|
||||
/**
|
||||
* 세션 만료 시 remember_token으로 자동 로그인
|
||||
*/
|
||||
public function handle(Request $request, Closure $next): Response
|
||||
{
|
||||
// 이미 인증된 경우 통과
|
||||
if (Auth::check()) {
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
// Remember Token으로 재인증 시도
|
||||
if (Auth::viaRemember()) {
|
||||
$user = Auth::user();
|
||||
|
||||
// HQ 테넌트 소속 확인
|
||||
if (!$user->belongsToHQ()) {
|
||||
Auth::logout();
|
||||
Log::info('[AutoLoginViaRemember] Non-HQ user rejected', ['user_id' => $user->id]);
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
// 활성 상태 확인
|
||||
if (!$user->is_active) {
|
||||
Auth::logout();
|
||||
Log::info('[AutoLoginViaRemember] Inactive user rejected', ['user_id' => $user->id]);
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
// HQ 테넌트를 기본 선택
|
||||
$hqTenant = $user->getHQTenant();
|
||||
if ($hqTenant) {
|
||||
session(['selected_tenant_id' => $hqTenant->id]);
|
||||
|
||||
// API 토큰 재발급
|
||||
$this->refreshApiToken($user->id, $hqTenant->id);
|
||||
}
|
||||
|
||||
Log::info('[AutoLoginViaRemember] Auto login successful', ['user_id' => $user->id]);
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
/**
|
||||
* API 토큰 재발급
|
||||
*/
|
||||
private function refreshApiToken(int $userId, int $tenantId): void
|
||||
{
|
||||
try {
|
||||
$result = $this->apiTokenService->exchangeToken($userId, $tenantId);
|
||||
|
||||
if ($result['success']) {
|
||||
$this->apiTokenService->storeTokenInSession(
|
||||
$result['data']['access_token'],
|
||||
$result['data']['expires_in']
|
||||
);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
Log::warning('[AutoLoginViaRemember] API token refresh failed', [
|
||||
'user_id' => $userId,
|
||||
'error' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,9 +26,9 @@
|
||||
'menu-sync/*',
|
||||
]);
|
||||
|
||||
// auth 미들웨어 그룹에 HQ 검증 추가
|
||||
// web 미들웨어 그룹에 자동 재인증 추가
|
||||
$middleware->appendToGroup('web', [
|
||||
// 기본 web 미들웨어에는 추가하지 않음 (auth에서만 적용)
|
||||
\App\Http\Middleware\AutoLoginViaRemember::class,
|
||||
]);
|
||||
})
|
||||
->withExceptions(function (Exceptions $exceptions): void {
|
||||
|
||||
Reference in New Issue
Block a user