Role-Based Access Control (RBAC) in Next.js?

Ich arbeite an der Implementierung einer Role-Based Access Control (RBAC) für meine API basierend auf Next.Js und möchte sicherstellen, dass ich die Best Practices für effiziente Datenbankabfragen einhalte. Meine Anwendung verwendet Next.js zusammen mit einer Backend-Datenbank ORM (drizzle-orm), um Benutzerrollen und Berechtigungen zu verwalten.

CREATE TABLE Users (
    user_id SERIAL PRIMARY KEY,
    username VARCHAR(255) UNIQUE NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE Roles (
    role_id SERIAL PRIMARY KEY,
    role_name VARCHAR(50) UNIQUE NOT NULL
);

CREATE TABLE UserRoles (
    user_id INT REFERENCES Users(user_id),
    role_id INT REFERENCES Roles(role_id),
    PRIMARY KEY (user_id, role_id)
);

CREATE TABLE Permissions (
    permission_id SERIAL PRIMARY KEY,
    permission_name VARCHAR(50) UNIQUE NOT NULL
);

CREATE TABLE RolePermissions (
    role_id INT REFERENCES Roles(role_id),
    permission_id INT REFERENCES Permissions(permission_id),
    PRIMARY KEY (role_id, permission_id)
);

CREATE TABLE Sessions (
    session_id UUID PRIMARY KEY,
    user_id INT REFERENCES Users(user_id),
    valid_until TIMESTAMP,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Derzeit werden bei jeder Anfrage die einem Benutzer zugewiesenen Rollen und Berechtigungen aus der Datenbank abgerufen, um die Zugriffsebene zu bestimmen. Ich bin jedoch besorgt über die potenziellen Auswirkungen dieses Ansatzes auf die Leistung, insbesondere wenn die Anwendung skaliert.

Was sind die besten Praktiken für die Implementierung von RBAC in Next.js bei gleichzeitiger Minimierung der Anzahl von Datenbankabfragen? Insbesondere interessiere ich mich für Strategien zur Zwischenspeicherung von Rollen- und Berechtigungsdaten, zur Optimierung der Token-basierten Autorisierung und zum Umgang mit dem Ablauf und der Ungültigkeit von Caches

programmieren, Datenbank, Webentwicklung, Authentifizierung
Software Planung/Gedanken?

Servus,

ich möchte aktuell eine Webanwendung programmieren.

Thema: Kochprogramm

Technik: Python, Flask, React, MySQL

Anforderungen der Webanwendung:

  • Anlegen und Editieren von Rezepten und Lebensmitteln
  • Dem User sollen Rezepte vorgeschlagen werden, die er mit seinen aktuellen Lebensmittelbestand zubereiten könnte (Rezepte erstellt der User alle selbst)
  • Fehlende Lebensmittel für ein Rezept sollen angezeigt werden können

Ich wollte nun fragen, ob meine Ideen so aufgehen könnten, oder ob ich etwas übersehe.

Ich würde folgenderweise vorgehen:

  • Ein Lebensmittel(Klasse)soll unter anderem die Attribute Maßeinheit, ID und Menge haben.
  • Ein Lebensmittel kann dann einem Rezept(Klasse) oder dem Lagerbestand(Klasse) zugewiesen werden (in einer ausgewählten Menge und Maßeinheit)
  • Eine weitere Klasse soll für das Umrechnen der Maßeinheiten und dem Vergleich des Lebensmittelbestands mit den jeweiligen gespeicherten Rezepten zuständig sein.
  • Rezept und Lager wären wie erwähnt jeweils eine eigene Klasse, welchen Lebensmittel als Instanz der Klasse "Lebensmittel" zugeordnet werden können.

Der Plan soll am Ende sein, dass von einer Datenbank abgerufen wird, welche Lebensmittel aktuell beim jeweiligen User in welcher Menge vorhanden sind, und welche Lebensmittel für ein Rezept in welcher Menge benötigt werden. Falls sich die Maßeinheiten unterscheiden (Prise, Gramm, Kilogramm) soll dies im Hintergrund umgerechnet werden.

Meint Ihr, dass könnte man so umsetzen? Übersehe ich vielleicht etwas?

Danke im Voraus!

 

programmieren, Informatik, Python, Softwareentwicklung
PHP: Login-System funktioniert nicht?

Hey, ich bin als Schüler gerade mit einem Partner dabei, an einem Projekt für den Informatikunterricht zu arbeiten. Aktuell arbeiten wir daran, dass man sich als Benutzer auf der Webseite anmelden kann.

Das Registrieren funktioniert bereits und als Vorlage diente uns dazu dieses Video:

https://www.youtube.com/watch?v=bNwT7pqVzDc

Nun sind in der Datenbank sowohl Benutzername als auch Passwort eingetragen. Als Benutzer soll man sich nun anmelden können und dann auf home.php weitergeleitet werden. Als Vorlage zum Anmelden verwendeten wir dieses Video:

https://www.youtube.com/watch?v=HrLucaAHLm8

Das Problem:

Wenn man versucht, sich auf der Webseite anzumelden, erscheint die Meldung "Passwort stimmt nicht ueberein", obwohl es übereinstimmen sollte. Hier ist der Quelltext:

<?php

 require("connection.php");

 if(isset($_POST["submit"])){

   $Benutzername = $_POST["Benutzername"];

   $Passwort = $_POST["Passwort"];

   $stmt = $con->prepare("SELECT * FROM Angestellten_Benutzer WHERE Benutzername=:Benutzername");

   $stmt->bindParam(":Benutzername", $Benutzername);

   $stmt->execute();

   $userExists = $stmt->fetchAll();

   $passwordHashed = $userExists[0]["Passwort"];

   $checkPassword = password_verify($Passwort, $passwordHashed);

   if($checkPassword === false){

     echo "Passwort stimmt nicht ueberein";

   }

   if($checkPassword === true){

     session_start();

     $_SESSION["Benutzername"] = $userExists[0]["Benutzername"];

     header("Location: home.php");

   }

 }

?>

<html lang="de">

<head>

   <meta charset="UTF-8">

   <meta http-equiv="X-UA-Compatible" content="IE=edge">

   <meta name="viewport" content="width=device-width, initial-scale=1.0">

   <title>Anmelden</title>

   <link rel="stylesheet" href="style.css">

</head>

<body>

   <form action="pp.php" method="POST">

       <h1>Anmelden</h1>

       <div class="inputs_container">

           <input type="text" placeholder="Benutzername" name="Benutzername" autocomplete="off">

           <input type="password" placeholder="Passwort" name="Passwort" autocomplete="off">

       </div>

       <button name="submit">Anmelden</button>

   </form>

</body>

</html>

Ich würde mich sehr über eine Korrektur dieses Codes freuen. Der Validator sowie die KI scheinen keine Lösung für das Problem zu haben und keine Probleme zu erkennen. Danke!

SQL, Webseite, programmieren, Datenbank, PHP
Java Code Hilfe?

Ich lerne gerade in der Schule Java zu programmieren. Aber unsere Lehrerin hat uns nicht richtig erklärt, wie unsere Aufgabe gemacht werden soll. Jetzt brauche ich Hilfe. Wir programmieren im Programm BlueJ und sollen im Script unserer Klasse KREIS eine double Methode machen, die den Umfang berechnet. Aber BlueJ zeigt einen Fehler am Ende der Klammer bei der Methode an. Bitte helft mir! Hier ist der Code:

public class KREIS
{
   //Attribute
   private int mittelpunktX;
   private int mittelpunktY;
   private int radius;
   private String fuellfarbe;

   //Konstruktor

   public KREIS(int mittelpunktXneu, int mittelpunktYneu, int radiusneu, String fuellfarbeneu)
   {
       mittelpunktX=mittelpunktXneu;
       mittelpunktY=mittelpunktYneu;
       radius=radiusneu;
       fuellfarbe=fuellfarbeneu;
   }

   //Methode

   public void setzeMittelpunkt(int mittelpunktXNew, int mittelpunktYNew)
   {
       mittelpunktX=mittelpunktXNew;
       mittelpunktY=mittelpunktYNew;
   }

   public void zeichne()
   {
       ZEICHENFENSTER.gibFenster().fuelleKreis(mittelpunktX,mittelpunktY,radius,fuellfarbe);
   }

   public void setzeFarbe(String fuellfarbeNeu)
   {
       fuellfarbe=fuellfarbeNeu;
   }

   public double UmfangBerechnen(radiusNeu);
   {
      return radiusNeu*2*3.14;
   }
}
PC, Software, programmieren, Java, Code, Informatik
Windows hat keinen Netzwerkzugriff auf IPV4, dafür aber IPV6?

Guten Abend,

ich habe seit mehreren Tagen das Problem, das mein IPV-4 kein Netzwerkzugriff hat. Dafür aber mein IPV-6, was erklären würde warum manche Seiten mir als "Unreachable" angezeigt werden und andere nicht (Die nur IPV6 brauchen).

Ich habe bisher bei CMD alles mit ipconifg, winsock, netsh etc etc probiert nach mehreren Neustarts. Nichts. Habe auch meinen Router ausgestöpselt und Neustart gedrückt (Hab noch nicht auf Reset gedrückt). Auch nichts.

Dieses Problem kam irgendwann aus dem nichts. Ich habe Windows komplett neu aufgesetzt aber das Problem besteht immernoch. Es betrifft NUR meinen Windows Rechner. Macbook, Smartphone etc hat keine Probleme. In unserer Nachbarschaft sind aktuell Bauarbeiten für Glasfaser (Bei dem wir nicht zugesagt haben).

Ich habe keine Manuelle DNS, und mein DHCP ist aktiviert.

Nutze auch keinen VPN oder Antivirus. WENN mein IPV4 "Internet" anzeigt sowie IPV6, dann laden die Seiten manchmal so lange bis zu einem Timeout. Also obwohl es mit 72,2mbit/s anzeigt, ist es viel weniger als das.

Hab auch versucht die DNS zu Google DNS zu ändern, auch nichts. Speedport zeigt mir an das ich mit dem Internet verbunden bin. Telefonie funktioniert auch etc etc.

Hat jemand eventuell eine Lösung wie ich IPV4 wieder aktivieren kann???

Als letzte Option müsste ich eventuell meinen Anbieter anrufen oder einen techniker kommen lassen. Irgendwie muss es ja wieder funktionieren.

Bild zum Beitrag
Server, Internet, Windows, Betriebssystem, WLAN, Internetverbindung, Technik, Netzwerk, IT, programmieren, DNS, Informatik, Informatiker, IP-Adresse, IPv6, LAN, Netzwerktechnik, Port, Router, Telekom, Windows 8, WLAN-Router, IPv4, Windows 10, Windows 11
php-Zugriff auf mysql funktioniert nicht?

Ich habe folgende Funktion in PHP geschrieben:

function getName($id) {
                global $conn;
                $sql = "SELECT Vorname, Nachname FROM mitglieder WHERE ID = `$id`";
                $result = $conn->query($sql);
                if ($result->num_rows > 0) {
                    $row = $result->fetch_assoc();
                    return $row['Vorname'] . " " . $row['Nachname'];
                } else {
                    return "";
                }
            }

Aber aus irgendeinem Grund kommt immer folgende Fehlermeldung:

Warning: Attempt to read property "num_rows" on bool in C:\xampp\htdocs\***********.php on line 35

Diese Variable $conn funktioniert aber an anderer Stelle im globalen Code außerhalb dieser Funktion einwandfrei wie gewünscht und ich sehe vom Code her keinen nennenswerten Unterschied.

Was ich bereits versucht habe:

  • $conn als Parameter an die Funktion zu übergeben
  • $conn in der Funktion selber zu definieren
  • $conn in der Funktion selber definieren und dass $conn im globalen Code entfernen
  • ChatGPT nach dem Fehler fragen
  • Folgende Fehlerabfrage einzubauen (dabei war $conn auch in der Funktion selber und NUR in der Funktion selber definiert):
if ($conn->connect_error) {
                die("Serverfehler: " . $conn->connect_error);
            }

Das führte aber nur zu folgender Fehlermeldung:

Warning: Attempt to read property "connect_error" on null in C:\xampp\htdocs\*********.php on line 26

Hat alles nichts geholfen. Wisst ihr wo der Fehler liegt?

Computer, Technik, SQL, HTML, Webseite, programmieren, JavaScript, Code, Datenbank, MySQL, PHP, Programmiersprache, Webentwicklung, phpMyAdmin, Programmierfehler

Meistgelesene Fragen zum Thema Programmieren