feat: JWT-basierte Token-Generierung und -Validierung für rollenbasierte UI-Zugriffe hinzugefügt

- `generateToken`-Funktion implementiert, um Tokens mit Benutzerrollen zu erstellen
- `decodeToken` in `KueModal` hinzugefügt, um das Token zu dekodieren und den "Firmware Update"-Button für Admin-Rolle bedingt anzuzeigen
- Fehlerbehandlung für ungültige Tokens in localStorage verbessert
- Sicherstellung der Token-Dekodierung für Admin-Zugriffskontrolle in Entwicklungs- und Produktionsumgebung
This commit is contained in:
ISA
2024-11-13 11:55:48 +01:00
parent e77340b2fb
commit 8412d0b9c2
6 changed files with 266 additions and 63 deletions

View File

@@ -8,7 +8,18 @@ import handleSave from "./handlers/handleSave";
import handleDisplayEinschalten from "./handlers/handleDisplayEinschalten";
import handleChange from "./handlers/handleChange";
function decodeToken(token) {
try {
const payload = JSON.parse(atob(token)); // Direkt das Token decodieren
return payload;
} catch (error) {
console.error("Fehler beim Dekodieren des Tokens:", error);
return null;
}
}
function KueModal({ showModal, onClose, slot, onModulNameChange }) {
const [isAdmin, setIsAdmin] = useState(false);
const dispatch = useDispatch();
const [ids, setIds] = useState(Array(32).fill("---"));
const [bezeichnungen, setBezeichnungen] = useState(Array(32).fill("---"));
@@ -84,6 +95,16 @@ function KueModal({ showModal, onClose, slot, onModulNameChange }) {
}
}, [showModal]); // nur von showModal abhängig ansonsten wird alle 10 Sekunden die Werte zurückgesetzt in Modal
//------------------------------------------------------------------------------------------------------------
useEffect(() => {
const token = localStorage.getItem("token");
if (token) {
const decoded = decodeToken(token);
if (decoded && decoded.role === "Admin") {
setIsAdmin(true);
}
}
}, [showModal]);
//------------------------------------------------------------------------------------------------------------
return (
<ReactModal
isOpen={showModal}
@@ -219,6 +240,12 @@ function KueModal({ showModal, onClose, slot, onModulNameChange }) {
</div>
<div className="flex justify-end bg-gray-100 p-4 rounded-b-lg">
{/* Bedingte Anzeige der Firmware-Update-Schaltfläche */}
{isAdmin && (
<button className="bg-littwin-blue text-white p-2 rounded flex items-center mr-2">
Firmware Update
</button>
)}
<button
onClick={handleDisplayEinschaltenWrapper}
className="bg-littwin-blue text-white p-2 rounded flex items-center mr-2"

View File

@@ -15,9 +15,9 @@ function Kue705FO({
tdrLocation,
alarmStatus,
}) {
console.log(
/* console.log(
`Rendering Kue705FO - SlotIndex: ${slotIndex}, ModulName: ${modulName}`
);
); */
const chartRef = useRef(null);
const [zoomPlugin, setZoomPlugin] = useState(null); // Plugin-Status für Chart.js
@@ -418,7 +418,7 @@ function Kue705FO({
// Effekt, um Modulnamen zu aktualisieren, wenn sich der Prop ändert
useEffect(() => {
setCurrentModulName(modulName);
console.log(`Modulname aktualisiert für Slot ${slotIndex}:`, modulName);
//console.log(`Modulname aktualisiert für Slot ${slotIndex}:`, modulName);
}, [modulName, slotIndex]);
//---------------------------------------------------
// Aktualisiert den Schleifenwiderstand, wenn sich der `schleifenwiderstand`-Prop ändert