- Notifications
You must be signed in to change notification settings - Fork 8
Authentication & Multi‐Tenancy Implementation Guide
This guide documents the complete implementation of Phase 6 - Authentication & Multi-Tenancy for the DevOps Monitoring Dashboard.
The authentication and multi-tenancy system provides:
- NextAuth.js Integration: Secure authentication with multiple providers
- Role-Based Access Control: Admin, Editor, and Viewer roles
- Multi-User Support: Each user can save their own dashboards and configurations
- User Management: Admin panel for managing users and permissions
- Session Management: Secure session handling with JWT tokens
User → Login Page → NextAuth.js → Database → JWT Token → Protected Routes User → User-Specific Config → Multi-Tenant Manager → Isolated Data Storage model User { id String @id @default(cuid()) email String @unique name String? image String? password String? // For credentials authentication role UserRole @default(VIEWER) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations accounts Account[] sessions Session[] dashboards Dashboard[] configurations Configuration[] teams TeamMember[] createdTeams Team[] }enum UserRole { ADMIN // Full system access EDITOR // Can modify configurations VIEWER // Read-only access }model Dashboard { id String @id @default(cuid()) name String description String? config Json // Dashboard configuration JSON isPublic Boolean @default(false) isDefault Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt userId String? // User-specific dashboard teamId String? // Team-specific dashboard user User? @relation(fields: [userId], references: [id]) team Team? @relation(fields: [teamId], references: [id]) } model Configuration { id String @id @default(cuid()) name String description String? config Json // Configuration JSON type ConfigType @default(MONITORING) isPublic Boolean @default(false) isDefault Boolean @default(false) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt userId String? // User-specific configuration teamId String? // Team-specific configuration user User? @relation(fields: [userId], references: [id]) team Team? @relation(fields: [teamId], references: [id]) }// lib/auth.ts export const authOptions: NextAuthOptions = { adapter: PrismaAdapter(prisma), providers: [ // Credentials provider for email/password login CredentialsProvider({ name: "credentials", credentials: { email: { label: "Email", type: "email" }, password: { label: "Password", type: "password" } }, async authorize(credentials) { // Validate credentials and return user } }), // OAuth providers GoogleProvider({ clientId: process.env.GOOGLE_CLIENT_ID || "", clientSecret: process.env.GOOGLE_CLIENT_SECRET || "", }), GitHubProvider({ clientId: process.env.GITHUB_CLIENT_ID || "", clientSecret: process.env.GITHUB_CLIENT_SECRET || "", }), ], session: { strategy: "jwt" }, callbacks: { async jwt({ token, user }) { if (user) { token.role = user.role } return token }, async session({ session, token }) { if (token) { session.user.id = token.sub! session.user.role = token.role as UserRole } return session } } }// middleware.ts export default withAuth( function middleware(req) { const token = req.nextauth.token const isAuth = !!token const userRole = token?.role // Redirect unauthenticated users if (!isAuth) { return NextResponse.redirect(new URL("/auth/signin", req.url)) } // Role-based access control if (req.nextUrl.pathname.startsWith("/admin") && userRole !== "ADMIN") { return NextResponse.redirect(new URL("/dashboard", req.url)) } if (req.nextUrl.pathname.startsWith("/settings") && !["ADMIN", "EDITOR"].includes(userRole as string)) { return NextResponse.redirect(new URL("/dashboard", req.url)) } }, { callbacks: { authorized: ({ token, req }) => { const publicRoutes = ["/", "/auth", "/api/auth"] const isPublicRoute = publicRoutes.some(route => req.nextUrl.pathname.startsWith(route) ) return isPublicRoute || !!token }, }, } )// lib/config/multi-tenant-manager.ts export class MultiTenantConfigManager { private configs: Map<string, MonitoringConfig> = new Map() private listeners: Map<string, Array<(config: MonitoringConfig) => void>> = new Map() getConfig(userId: string): MonitoringConfig { return this.configs.get(userId) || { ...DEFAULT_CONFIG } } updateConfig(userId: string, update: ConfigUpdate): ConfigValidationResult { // Update configuration for specific user } loadFromJson(userId: string, jsonString: string): ConfigValidationResult { // Load configuration from JSON for specific user } exportToJson(userId: string): string { // Export user-specific configuration } }// lib/hooks/use-multi-tenant-config.ts export function useMultiTenantConfig() { const { data: session } = useSession() const userId = session?.user?.id || 'anonymous' const [config, setConfig] = useState<MonitoringConfig>(() => { if (typeof window !== 'undefined') { return multiTenantConfigManager.getConfig(userId) } return DEFAULT_CONFIG }) // User-specific configuration operations const updateConfig = useCallback(async (update: ConfigUpdate) => { return multiTenantConfigManager.updateConfig(userId, update) }, [userId]) return { config, updateConfig, loadFromJson: (jsonString: string) => multiTenantConfigManager.loadFromJson(userId, jsonString), exportConfig: () => multiTenantConfigManager.exportToJson(userId), // ... other user-specific operations } }- Credentials Login: Email/password authentication
- OAuth Providers: Google and GitHub integration
- Demo Credentials: Pre-configured demo accounts
- Responsive Design: Mobile-friendly interface
- Error Handling: User-friendly error messages
- Registration Form: Name, email, password fields
- Password Validation: Minimum length and confirmation
- OAuth Registration: Automatic account creation
- Success Flow: Auto sign-in after registration
- User Avatar: Profile picture or initials
- Role Badge: Visual role indicator
- Dropdown Menu: Profile, settings, admin access
- Sign Out: Secure logout functionality
- User Management: View, edit, delete users
- Role Assignment: Change user roles
- System Statistics: User counts, configurations
- Access Control: Admin-only access
- Personal Information: Name, email editing
- Account Statistics: Dashboards, configurations
- Preferences: User-specific settings
- Security: Password and authentication settings
// Example: Admin-only component {session?.user?.role === "ADMIN" && ( <AdminPanel /> )} // Example: Editor and Admin access {["ADMIN", "EDITOR"].includes(session?.user?.role || "") && ( <ConfigurationEditor /> )}- Password Hashing: bcrypt with salt rounds
- JWT Tokens: Secure session management
- CSRF Protection: Built-in NextAuth.js protection
- Session Timeout: Configurable session duration
- Route Protection: Middleware-based access control
- Role-Based Access: Granular permission system
- API Protection: Server-side role validation
- Data Isolation: User-specific data access
- Input Validation: Schema-based validation
- SQL Injection Prevention: Prisma ORM protection
- XSS Protection: React built-in protection
- Secure Headers: Next.js security headers
- ✅ Full System Access: All features and pages
- ✅ User Management: Create, edit, delete users
- ✅ System Configuration: Global settings
- ✅ Data Access: All user data and configurations
- ✅ Admin Panel: Complete administrative access
- ✅ Configuration Management: Create and edit configs
- ✅ Dashboard Creation: Build custom dashboards
- ✅ Settings Access: User and team settings
- ❌ User Management: Cannot manage other users
- ❌ Admin Panel: No administrative access
- ✅ Read-Only Access: View dashboards and data
- ✅ Personal Profile: Edit own profile
- ❌ Configuration Changes: Cannot modify configs
- ❌ Dashboard Creation: Cannot create dashboards
- ❌ Settings Access: Limited settings access
The system includes pre-configured demo users for testing:
- Email:
demo@example.com - Password:
demo123 - Role: Admin
- Access: Full system access
- Email:
editor@example.com - Password:
editor123 - Role: Editor
- Access: Configuration and dashboard management
- Email:
viewer@example.com - Password:
viewer123 - Role: Viewer
- Access: Read-only access
- Isolated Storage: Each user has their own configuration space
- Custom Dashboards: Personal dashboard configurations
- Private Settings: User-specific preferences
- Data Privacy: Complete data isolation between users
- Team Creation: Users can create and join teams
- Shared Resources: Team-wide dashboards and configurations
- Team Roles: Owner, Admin, Member, Viewer roles
- Collaboration: Shared monitoring and alerting
- Import/Export: JSON-based configuration sharing
- Version Control: Configuration history and rollback
- Templates: Pre-built configuration templates
- Validation: Schema-based configuration validation
# Database DATABASE_URL="file:./dev.db" # NextAuth.js NEXTAUTH_URL="http://localhost:3000" NEXTAUTH_SECRET="your-secret-key-here" # OAuth Providers (optional) GOOGLE_CLIENT_ID="" GOOGLE_CLIENT_SECRET="" GITHUB_CLIENT_ID="" GITHUB_CLIENT_SECRET=""# Generate Prisma client npx prisma generate # Run database migrations npx prisma migrate dev --name init # Seed demo users npx tsx prisma/seed.ts# Start the development server npm run dev- Landing Page: Redirects to sign-in if not authenticated
- Sign In: Multiple authentication options
- Dashboard: Role-based dashboard access
- User Menu: Profile and settings access
- Sign Out: Secure logout with session cleanup
- Admin: Full access to all features and admin panel
- Editor: Configuration and dashboard management
- Viewer: Read-only access with personal profile
- Personal Configurations: Each user has their own settings
- Isolated Data: No cross-user data access
- Custom Dashboards: Personal dashboard configurations
- Private Settings: User-specific preferences
-
POST /api/auth/register- User registration -
POST /api/auth/signin- User sign in -
POST /api/auth/signout- User sign out -
GET /api/auth/session- Get current session
-
GET /api/users- List users (Admin only) -
POST /api/users- Create user (Admin only) -
PUT /api/users/[id]- Update user (Admin only) -
DELETE /api/users/[id]- Delete user (Admin only)
-
GET /api/config- Get user configuration -
POST /api/config- Update user configuration -
GET /api/config/export- Export user configuration -
POST /api/config/import- Import user configuration
- Multi-Layer Authentication: Multiple auth providers
- Role-Based Access Control: Granular permissions
- Data Isolation: Complete user data separation
- Session Security: JWT-based secure sessions
- Multi-Tenant Architecture: Support for multiple users
- User-Specific Configurations: Isolated data storage
- Team Support: Future team collaboration features
- Database Optimization: Efficient data queries
- Intuitive Interface: Easy-to-use authentication
- Role-Based UI: Contextual interface based on role
- Personal Customization: User-specific configurations
- Responsive Design: Mobile-friendly interface
- User Management: Complete user administration
- Role Assignment: Easy role management
- System Monitoring: User activity tracking
- Configuration Management: Global and user-specific settings
- Two-Factor Authentication: Enhanced security
- SSO Integration: Enterprise authentication
- API Key Management: Programmatic access
- Audit Logging: User activity tracking
- Team Workspaces: Shared team environments
- Role Inheritance: Team-based role management
- Shared Resources: Team dashboards and configs
- Collaboration Tools: Team communication features
- LDAP Integration: Enterprise directory services
- SAML Support: Enterprise SSO
- Advanced Permissions: Granular access control
- Compliance: Audit trails and reporting
- Login Flow: Test all authentication methods
- Role Access: Verify role-based access control
- Session Management: Test session persistence
- Security: Test authentication security
- Data Isolation: Verify user data separation
- Configuration Management: Test user-specific configs
- Permission Testing: Verify role-based permissions
- User Management: Test admin user management
The Authentication & Multi-Tenancy system provides a robust, secure, and scalable foundation for the DevOps Monitoring Dashboard. With role-based access control, user-specific configurations, and comprehensive security features, the system is ready for production use and can scale to support multiple users and teams.
The implementation includes:
- ✅ Complete Authentication System with NextAuth.js
- ✅ Role-Based Access Control with Admin, Editor, and Viewer roles
- ✅ Multi-User Support with isolated configurations
- ✅ User Management with admin panel
- ✅ Security Features with proper authentication and authorization
- ✅ Responsive UI with mobile-friendly design
- ✅ Database Integration with Prisma and SQLite
- ✅ Demo Users for testing and demonstration
The system is now ready for production deployment and can be extended with additional features as needed! 🚀
Built with passion and purpose by Harshhaa.
Your ideas, feedback, and contributions are what make this project better.
Let’s shape the future of DevOps monitoring together! 🚀
Connect & Collaborate:
- GitHub: @NotHarshhaa
- Blog: ProDevOpsGuy
- Telegram Community: Join Here
- LinkedIn: Harshhaa Vardhan Reddy
If you found this project useful:
- ⭐ Star the repository to show your support
- 📢 Share it with your friends and colleagues
- 📝 Open issues or submit pull requests to help improve it
Join the community, share your experience, and help us grow!
- 🏠 Home
