From c0ffbbcf381c9d191c5e87c6f697445a9d5d9ef7 Mon Sep 17 00:00:00 2001 From: ISA Date: Thu, 14 Nov 2024 13:48:04 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20JWT-Authentifizierung=20in=20SettingMod?= =?UTF-8?q?al=20implementiert=20und=20Modal-Stabilit=C3=A4t=20verbessert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - JWT-Token-Erstellung und -Speicherung für sichere Admin-Authentifizierung in SettingModal hinzugefügt. - Stabilitätsprobleme des Modals behoben. - Funktionalität des Modals und des Tokens überprüft, um eine reibungslose Benutzererfahrung sicherzustellen. --- components/Header.jsx | 18 +- .../modales/settingsModal/SettingsModal.jsx | 468 ++++++++++-------- package-lock.json | 21 + package.json | 1 + pages/login.js | 126 ----- 5 files changed, 279 insertions(+), 355 deletions(-) delete mode 100644 pages/login.js diff --git a/components/Header.jsx b/components/Header.jsx index f2f8f4c..d122eef 100644 --- a/components/Header.jsx +++ b/components/Header.jsx @@ -1,4 +1,5 @@ -"use client"; // components/Header.jsx +// components/Header.jsx +"use client"; import React, { useState } from "react"; import Image from "next/image"; import { useRouter } from "next/router"; @@ -15,13 +16,6 @@ function Header() { const handleCloseSettingsModal = () => setShowSettingsModal(false); const handleLogout = () => (window.location.href = "/offline.html"); - // Funktion zur Weiterleitung zur Login-Seite abhängig von der Umgebung - const handleAdminLogin = () => { - const loginPath = - process.env.NODE_ENV === "production" ? "/login.html" : "/login"; - router.push(loginPath); - }; - return (
@@ -52,14 +46,6 @@ function Header() {
- - - {/* Weitere Inhalte wie Formular */} -
-

System:

-
-
- - setName(e.target.value)} - /> -
- -
-
+ {/* Hauptinhalt oder Login-Formular */} + {showLoginForm ? ( +
+

Admin Login

+ e.preventDefault()}> +
setMac1(e.target.value)} - disabled + value={username} + onChange={(e) => setUsername(e.target.value)} + /> +
+
+ + setPassword(e.target.value)} + /> +
+ {error &&

{error}

} + + +
+ ) : ( +
+

System:

+
+
+ + setName(e.target.value)} />
-
-
-
- - setIp(e.target.value)} - /> -
-
- - setSubnet(e.target.value)} - /> -
-
- -
-
- - setGateway(e.target.value)} - /> -
-
- - - {/* Button für Systemzeit übernehmen */} - -
- +
+
+ + setMac1(e.target.value)} + disabled + />
-
- {/* SNTP Client */} -

SNTP Client:

-
-
- - setNtp1(e.target.value)} - /> +
+
+ + setIp(e.target.value)} + /> +
+
+ + setSubnet(e.target.value)} + /> +
-
- - setNtp2(e.target.value)} - /> -
-
- - setNtp3(e.target.value)} - /> -
-
- - setNtpTimezone(e.target.value)} - /> -
-
- - setActive(e.target.value)} - /> -
-
- {/* Modal Footer */} -
- - - -
- -
- +
+
+ + setGateway(e.target.value)} + /> +
+
+ + + {/* Button für Systemzeit übernehmen */} - {/* Reboot Modal */} - -

CPL wird neu gestartet...

- {/* Spinner */} -

Bitte warten Sie 5 Sekunden...

+
+ +
+
+
+ + {/* SNTP Client */} +

SNTP Client:

+
+
+ + setNtp1(e.target.value)} + /> +
+
+ + setNtp2(e.target.value)} + /> +
+
+ + setNtp3(e.target.value)} + /> +
+
+ + setNtpTimezone(e.target.value)} + /> +
+
+ + setActive(e.target.value)} + /> +
+
+ + {/* Modal Footer */} +
+ + + + +
+ +
+ )} ); diff --git a/package-lock.json b/package-lock.json index c5bcbfb..29a4c7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "react-modal": "^3.16.1", "react-redux": "^9.1.2", "react-spinners": "^0.14.1", + "react-toastify": "^10.0.6", "redux": "^5.0.1", "redux-persist": "^6.0.0" }, @@ -662,6 +663,14 @@ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1688,6 +1697,18 @@ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-toastify": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-10.0.6.tgz", + "integrity": "sha512-yYjp+omCDf9lhZcrZHKbSq7YMuK0zcYkDFTzfRFgTXkTFHZ1ToxwAonzA4JI5CxA91JpjFLmwEsZEgfYfOqI1A==", + "dependencies": { + "clsx": "^2.1.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", diff --git a/package.json b/package.json index e746bbf..bbcb33a 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "react-modal": "^3.16.1", "react-redux": "^9.1.2", "react-spinners": "^0.14.1", + "react-toastify": "^10.0.6", "redux": "^5.0.1", "redux-persist": "^6.0.0" }, diff --git a/pages/login.js b/pages/login.js deleted file mode 100644 index 27ec2ac..0000000 --- a/pages/login.js +++ /dev/null @@ -1,126 +0,0 @@ -// pages/index.js - -import Image from "next/image"; -import { useState } from "react"; -import { useRouter } from "next/router"; - -const USERS = { - Admin: { username: "admin", password: "admin", role: "Admin" }, - Ismail: { username: "ismail", password: "ismail", role: "Admin" }, -}; - -function generateToken(user) { - const payload = { - username: user.username, - role: user.role, - exp: Date.now() + 5 * 60 * 1000, // Ablauf in 5 Minuten - }; - return btoa(JSON.stringify(payload)); // Verwende btoa für das Payload -} - -export default function Home() { - const router = useRouter(); - const [username, setUsername] = useState(""); - const [password, setPassword] = useState(""); - const [error, setError] = useState(""); - - const handleLogin = (e) => { - e.preventDefault(); - const user = Object.values(USERS).find( - (u) => u.username.toLowerCase() === username.toLowerCase() - ); - - if (user && user.password === password) { - const token = generateToken(user); - localStorage.setItem("token", token); - - // Überprüfen, ob es sich um die Produktionsumgebung handelt - const targetPath = - process.env.NODE_ENV === "production" - ? "/kabelueberwachung.html" - : "/kabelueberwachung"; - router.replace(targetPath); - } else { - setError("Login fehlgeschlagen"); - } - }; - - return ( -
- {/* Hintergrundbild */} -
- - {/* Overlay */} -
- -
- {/* Logo */} -
- Littwin Logo -
- - {/* Titel */} -

Willkommen

- - {/* Formular */} -
- {/* Benutzername */} -
- - setUsername(e.target.value)} - className="w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-transparent" - /> -
- - {/* Passwort */} -
- - setPassword(e.target.value)} - className="w-full px-2 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-transparent" - /> -
- - {/* Login Button */} - -
- {error &&

{error}

} -
-
- ); -}