Files
hr-portal/frontend/test-redis.js
Porsche Chen 360533393f feat: HR Portal - Complete Multi-Tenant System with Redis Session Storage
Major Features:
-  Multi-tenant architecture (tenant isolation)
-  Employee CRUD with lifecycle management (onboarding/offboarding)
-  Department tree structure with email domain management
-  Company info management (single-record editing)
-  System functions CRUD (permission management)
-  Email account management (multi-account per employee)
-  Keycloak SSO integration (auth.lab.taipei)
-  Redis session storage (10.1.0.254:6379)
  - Solves Cookie 4KB limitation
  - Cross-system session sharing
  - Sliding expiration (8 hours)
  - Automatic token refresh

Technical Stack:
Backend:
- FastAPI + SQLAlchemy
- PostgreSQL 16 (10.1.0.20:5433)
- Keycloak Admin API integration
- Docker Mailserver integration (SSH)
- Alembic migrations

Frontend:
- Next.js 14 (App Router)
- NextAuth 4 with Keycloak Provider
- Redis session storage (ioredis)
- Tailwind CSS

Infrastructure:
- Redis 7 (10.1.0.254:6379) - Session + Cache
- Keycloak 26.1.0 (auth.lab.taipei)
- Docker Mailserver (10.1.0.254)

Architecture Highlights:
- Session管理由 Keycloak + Redis 統一控制
- 支援多系統 (HR/WebMail/Calendar/Drive/Office) 共享 session
- Token 自動刷新,異質服務整合
- 未來可無縫遷移到雲端

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-23 20:12:43 +08:00

47 lines
1.0 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Test Redis Connection and Check Session Keys
*/
const Redis = require('ioredis')
const redis = new Redis({
host: '10.1.0.20',
port: 6379,
password: '!DC1qaz2wsx',
db: 0,
})
async function testRedis() {
try {
console.log('Testing Redis connection...')
// Test connection
const pong = await redis.ping()
console.log('✅ Redis PING:', pong)
// List all nextauth keys
const keys = await redis.keys('nextauth:*')
console.log('\n📋 NextAuth session keys:', keys)
console.log('Total keys:', keys.length)
// Show first key content if exists
if (keys.length > 0) {
const firstKey = keys[0]
const value = await redis.get(firstKey)
console.log(`\n📄 Content of ${firstKey}:`)
console.log(value)
const ttl = await redis.ttl(firstKey)
console.log(`\n⏰ TTL: ${ttl} seconds`)
} else {
console.log('\n⚠ No session keys found!')
}
} catch (error) {
console.error('❌ Redis error:', error)
} finally {
redis.disconnect()
}
}
testRedis()