session = \Config\Services::session(); } private function getAuthInfo(string $key = ""): array|int|string|null { $authInfo = $this->session->get(self::SESSION_AUTH_INFO); if ($key) { return $authInfo[$key] ?? null; } return $authInfo; } // ---------------------------------------------------- // Public Accessors (AuthService에서 이동) // ---------------------------------------------------- public function getUID(): int { $uid = $this->getAuthInfo('uid'); if ($uid === null || $uid === '') { throw new \RuntimeException('Not logged in'); } return (int) $uid; } public function getID(): string|null { return $this->getAuthInfo('id'); } public function getName(): string|null { return $this->getAuthInfo('name'); } public function getRole(): array|null { return $this->getAuthInfo('role'); } public function isLoggedIn(): bool { return $this->session->has(self::SESSION_IS_LOGIN); } public function isAccessRole(array $roles): bool { $userRoles = $this->getRole(); if (empty($userRoles) || !is_array($userRoles)) { return false; } return !empty(array_intersect($userRoles, $roles)); } public function pushCurrentUrl(string $url): void { $this->session->set($this->urlStackName, $url); } public function popPreviousUrl(): string { $url = $this->session->get($this->urlStackName) ?? ""; if (!empty($url)) { $this->session->set($this->urlStackName, ""); // 세션에서 제거 return $url; } return '/'; } // ---------------------------------------------------- // Session Writers (Login/Logout Process) // ---------------------------------------------------- /** * 인증 성공 후 세션에 사용자 정보를 기록합니다. */ public function setAuthSession(UserEntity $entity): void { $this->session->set(self::SESSION_IS_LOGIN, true); $this->session->set(self::SESSION_AUTH_INFO, [ 'uid' => (int) $entity->getPK(), 'id' => $entity->getID(), 'name' => $entity->getTitle(), 'role' => $entity->getRole() ]); } /** * 로그아웃 시 세션 및 쿠키를 파괴합니다. */ public function destroyAuthSession(): void { // 세션 데이터 삭제 $this->session->remove(self::SESSION_IS_LOGIN); $this->session->remove(self::SESSION_AUTH_INFO); // 모든 세션 데이터 삭제 $this->session->destroy(); // 세션 쿠키 삭제 (AuthService에서 가져온 로직) if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie( session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"] ); } // 세션 재생성 session_start(); $this->session->regenerate(true); } }