Mysql
 sql >> Base de données >  >> RDS >> Mysql

Faire passer les utilisateurs du nom d'utilisateur au groupe d'utilisateurs

Comment créer un simple formulaire d'enregistrement et de connexion ?

La première chose que vous devez considérer lors de la création du portail d'enregistrement des utilisateurs est où et comment vous allez stocker les comptes d'utilisateurs. Pour cela nous allons utiliser la base de données MySQL avec le tableau suivant :

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;

Dans cette table, nous allons stocker le nom d'utilisateur et le hachage du mot de passe. Nous avons également une colonne qui nous indiquera le type de compte; qu'il s'agisse d'un utilisateur normal ou d'un administrateur.

Connexion à la base de données

Nous devons évidemment nous connecter à la base de données et démarrer une session. Ces sujets sont hors de portée de cette réponse. Nous allons utiliser PDO pour nous connecter à notre base de données qui contient notre nouvelle table.

<?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
]);

Pour une explication plus approfondie du fonctionnement de PDO, consultez cet article :https://phpdelusions.net/pdo

Fonction d'enregistrement

Nous pouvons maintenant créer une fonction simple qui enregistrera un utilisateur dans la base de données. Cette fonction acceptera 3 paramètres :la connexion à la base de données, le nom d'utilisateur et le mot de passe.

Cette fonction créera un hachage du mot de passe, puis supprimera ce mot de passe. C'est un exemple simple, mais en termes réels, vous voudriez probablement ajouter plus de vérifications et rendre cela plus infaillible.

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
    ]);
}

La fonction de connexion

Tout comme nous l'avons fait avec la fonction d'enregistrement, nous allons créer une fonction pour la connexion. La fonction acceptera les mêmes paramètres, mais au lieu de INSERT il va SELECT de la base de données en fonction du nom d'utilisateur correspondant.

S'il existe un enregistrement correspondant dans la base de données et que le mot de passe est vérifié par rapport au hachage stocké, nous stockons les informations de l'utilisateur dans une session. La session conservera ces informations sur le disque dur et donnera à l'utilisateur un cookie à utiliser lors de futures demandes. L'utilisation de ce cookie PHP ouvrira la même session chaque fois que la page sera demandée.

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'];
}

Le code complet

Nous pouvons maintenant connecter tout cela ensemble et ajouter des formulaires HTML. La partie HTML est hors de portée mais vous voudriez la garder séparée de votre logique PHP. Probablement dans un fichier séparé.

<?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;

Ceci est un exemple très simple du fonctionnement de l'enregistrement et de la connexion en PHP. Je ne recommanderais pas de l'utiliser tel quel sur un site en ligne, mais à des fins d'apprentissage, il devrait démontrer comment cette fonctionnalité fonctionne.

Vous pouvez construire dessus et faire quelque chose lorsque le type d'utilisateur est différent. Afficher plus de contenu à des utilisateurs plus privilégiés.