feat: implement user authentication and authorization with NextAuth, including user schema, password hashing, and role-based access control.

This commit is contained in:
Michael committed 2026-02-22 14:11:36 +01:00
1 parent c842c2447a
commit 359d196c4d
18 files changed
+652 -32

No files matched your search

+17
View File
@@ -0,0 +1,17 @@
import { LoginForm } from "@/features/auth/components/login-form";
export default function LoginPage() {
return (
<main className="min-h-screen flex items-center justify-center bg-slate-50 dark:bg-slate-950 p-6 relative overflow-hidden">
{/* Éléments de design en arrière-plan pour l'effet "Apple Premium" */}
<div className="absolute top-0 left-0 w-full h-full overflow-hidden pointer-events-none z-0">
<div className="absolute top-[-10%] left-[-10%] w-[40%] h-[40%] bg-indigo-500/10 dark:bg-indigo-500/5 blur-[120px] rounded-full" />
<div className="absolute bottom-[-10%] right-[-10%] w-[40%] h-[40%] bg-emerald-500/10 dark:bg-emerald-500/5 blur-[120px] rounded-full" />
</div>
<div className="relative z-10 w-full flex justify-center">
<LoginForm />
</div>
</main>
);
}
+11
View File
@@ -8,6 +8,9 @@ import { useScoreSettingsStore } from "@/features/score/store/use-score-settings
import { useDbSettingsStore } from "@/features/settings/store/use-db-settings-store";
import { testDatabaseConnection, saveDatabaseSettings, getSavedDatabaseConfig } from "@/features/settings/actions";
import { useEffect } from "react";
import { UserManagement } from "@/features/admin/components/user-management";
import { auth } from "@/lib/auth";
import { redirect } from "next/navigation";
interface OpenRouterModel { id: string; name: string; free: boolean; }
@@ -402,6 +405,14 @@ export default function SettingsPage() {
</div>
</Section>
{/* Gestion des Utilisateurs */}
<Section
title="Gestion des Utilisateurs"
subtitle="Administration des accès et des rôles"
>
<UserManagement />
</Section>
{/* Save */}
<div className="flex items-center gap-3">
<button
+2
View File
@@ -0,0 +1,2 @@
import { handlers } from "@/lib/auth";
export const { GET, POST } = handlers;
+4 -2
View File
@@ -14,6 +14,8 @@ export const metadata: Metadata = {
description: "Révision d'Assortiment Haute Performance",
};
import { Providers } from "./providers";
export default function RootLayout({
children,
}: Readonly<{
@@ -22,9 +24,9 @@ export default function RootLayout({
return (
<html lang="fr" suppressHydrationWarning>
<body className={`${inter.variable} font-sans antialiased`}>
<ThemeProvider>
<Providers>
{children}
</ThemeProvider>
</Providers>
</body>
</html>
);
+14
View File
@@ -0,0 +1,14 @@
"use client";
import { SessionProvider } from "next-auth/react";
import { ThemeProvider } from "@/components/shared/theme-provider";
export function Providers({ children }: { children: React.ReactNode }) {
return (
<SessionProvider>
<ThemeProvider>
{children}
</ThemeProvider>
</SessionProvider>
);
}