Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Benutzer vom Benutzernamen in die Benutzergruppe umwandeln

Wie erstelle ich eine einfache Benutzerregistrierung und ein Anmeldeformular?

Das erste, was Sie bei der Erstellung des Benutzerregistrierungsportals beachten sollten, ist, wo und wie Sie Benutzerkonten speichern werden. Zu diesem Zweck verwenden wir die MySQL-Datenbank mit der folgenden Tabelle:

CREATE TABLE IF NOT EXISTS `accounts` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Username` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `Hash` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `UserType` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

In dieser Tabelle speichern wir den Benutzernamen und den Passwort-Hash. Wir haben auch eine Spalte, die uns den Typ des Kontos mitteilt; ob es sich um einen normalen Benutzer oder einen Administrator handelt.

Datenbankverbindung

Wir müssen uns natürlich mit der Datenbank verbinden und eine Sitzung starten. Diese Themen sind nicht Gegenstand dieser Antwort. Wir werden PDO verwenden, um eine Verbindung zu unserer Datenbank herzustellen, die unsere neue Tabelle enthält.

<?php

session_start();

$pdo = new PDO('mysql:host=localhost;charset=utf8mb4;dbname=test', 'dbuser', 'password', [
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_EMULATE_PREPARES => false
]);

Für eine ausführlichere Erklärung, wie PDO funktioniert, schauen Sie sich diesen Artikel an:https://phpdelusions.net/pdo

Registerfunktion

Wir können jetzt eine einfache Funktion erstellen, die einen Benutzer in der Datenbank registriert. Diese Funktion akzeptiert 3 Parameter:die DB-Verbindung, den Benutzernamen und das Passwort.

Diese Funktion erstellt einen Hash des Passworts und verwirft dieses Passwort. Es ist ein einfaches Beispiel, aber in der Realität würden Sie wahrscheinlich mehr Überprüfungen hinzufügen und dies narrensicherer machen wollen.

function register(PDO $db, string $username, string $password)
{
    if (!$username || !$password) {
        throw new Exception('Username and password is required!');
    }
    $hash = password_hash($password, PASSWORD_DEFAULT);
     
    $stmt = $db->prepare('INSERT INTO accounts(Username, Hash, UserType) VALUES(?,?,?)');
    $stmt->execute([
        $username,
        $hash,
        'user' // or admin
    ]);
}

Die Login-Funktion

Genau wie bei der Registrierungsfunktion erstellen wir eine Funktion zum Anmelden. Die Funktion akzeptiert die gleichen Parameter, jedoch anstelle von INSERT es wird SELECT aus der Datenbank basierend auf dem übereinstimmenden Benutzernamen.

Wenn es einen übereinstimmenden Datensatz in der Datenbank gibt und das Passwort anhand des gespeicherten Hashs verifiziert wird, speichern wir die Benutzerinformationen in einer Sitzung. Die Sitzung speichert diese Informationen auf der Festplatte und gibt dem Benutzer ein Cookie, das bei zukünftigen Anfragen verwendet werden kann. Mit diesem Cookie öffnet PHP jedes Mal dieselbe Sitzung, wenn die Seite angefordert wird.

function login(PDO $db, string $username, string $password)
{
    if (!$username || !$password) {
        throw new Exception('Username and password is required!');
    }
     
    $stmt = $db->prepare('SELECT Id, Hash, UserType FROM accounts WHERE Username=?');
    $stmt->execute([ $username ]);
    $user = $stmt->fetch();
    if (!$user || !password_verify($password, $user['Hash'])) {
        throw new Exception('Username or password incorrect!');
    }

    $_SESSION['loggedUserId'] = $user['Id'];
    $_SESSION['UserType'] = $user['UserType'];
}

Der vollständige Code

Wir können jetzt all dies miteinander verbinden und einige HTML-Formulare hinzufügen. Der HTML-Teil ist außerhalb des Gültigkeitsbereichs, aber Sie möchten ihn von Ihrer PHP-Logik getrennt halten. Wahrscheinlich in einer separaten Datei.

<?php

session_start();

$pdo = new PDO('mysql:host=localhost;charset=utf8mb4;dbname=test', 'inet', '5432', [
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_EMULATE_PREPARES => false
]);

function register(PDO $db, string $username, string $password)
{
    if (!$username || !$password) {
        throw new Exception('Username and password is required!');
    }
    $hash = password_hash($password, PASSWORD_DEFAULT);
     
    $stmt = $db->prepare('INSERT INTO accounts(Username, Hash, UserType) VALUES(?,?,?)');
    $stmt->execute([
        $username,
        $hash,
        'user' // or admin
    ]);
}

function login(PDO $db, string $username, string $password)
{
    if (!$username || !$password) {
        throw new Exception('Username and password is required!');
    }
     
    $stmt = $db->prepare('SELECT Id, Hash, UserType FROM accounts WHERE Username=?');
    $stmt->execute([ $username ]);
    $user = $stmt->fetch();
    if (!$user || !password_verify($password, $user['Hash'])) {
        throw new Exception('Username or password incorrect!');
    }

    $_SESSION['loggedUserId'] = $user['Id'];
    $_SESSION['UserType'] = $user['UserType'];
}

if (isset($_POST['register'])) {
    register($pdo, $_POST['username'], $_POST['password']);
}

if (isset($_POST['login'])) {
    login($pdo, $_POST['username'], $_POST['password']);
}

if (!isset($_SESSION['loggedUserId'])):
?>
<!-- Register form -->
<form  method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" name="register" value="Register">
</form>

<!-- Login form -->
<form  method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" name="login" value="Log in">
</form>
<?php
else:
echo 'Here be something after login. You are a '.$_SESSION['UserType'];
endif;

Dies ist ein sehr einfaches Beispiel dafür, wie die Registrierung und Anmeldung in PHP funktioniert. Ich würde nicht empfehlen, es so wie es ist auf einer Live-Site zu verwenden, aber zu Lernzwecken sollte es zeigen, wie diese Funktionalität funktioniert.

Sie können darauf aufbauen und etwas tun, wenn der Benutzertyp anders ist. Mehr Inhalte für privilegiertere Benutzer anzeigen.