Administratorrollen im Admin-Bereich – PHP & MySQL

[ad_1]

Angenommen, Sie haben ein Admin-Panel Ihrer Website, in dem Sie die Daten Ihrer Website verwalten können. Jetzt möchten Sie eine Funktionalität haben, mit der Sie Unteradministratoren mit Zugriff auf eingeschränkte Funktionen erstellen können. Beispielsweise kann ein Administrator Beiträge verwalten (Hinzufügen, Bearbeiten und Löschen), ein anderer Administrator kann Kunden verwalten, ein anderer Administrator kann Mitarbeiter verwalten und so weiter. Und sie werden alle von Superadministratoren verwaltet.

In diesem Artikel erstellen wir einen Unteradministrator zum Verwalten von Posts. Erstellen Sie eine Tabelle für Administratoren, in der eine Spalte mit dem Namen „Rollen“ angezeigt wird. Der Typ lautet ENUM, damit Sie die Rollen angeben können. Es werden keine anderen als die in ENUM angegebenen Rollen akzeptiert.

CREATE TABLE `admins` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `email` text NOT NULL,
  `password` text NOT NULL,
  `role` enum('all','manage_posts') NOT NULL
);

CREATE TABLE `posts` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `title` text NOT NULL,
  `created_by` int(11) NOT NULL,
  CONSTRAINT `fk_created_by_posts` FOREIGN KEY (`created_by`) REFERENCES `admins` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
);

Super Admin wird manuell und nur einmal erstellt. Geben Sie dem Superadministrator die Rolle „Alle“:

INSERT INTO `admins` (`id`, `email`, `password`, `role`) VALUES
(1, '[email protected]', '$2y$10$e0qHrQw8irU1TPxjzfB2OOAQ/uUH/xq5jAP58f796jMAOLwEv2d9i', 'all')

Sie können einen Passwort-Hash generieren von hier. Zuerst erstellen wir ein Anmeldeformular für alle Administratoren:

<?php
    // start session and connect with database
    session_start();
    $conn = mysqli_connect("localhost", "root", "root", "tutorials");
?>

<!-- check if admin is logged in -->
<?php if (isset($_SESSION["admin"])): ?>
    <!-- button to logout -->
    <p>
        <a href="?logout">Logout</a>
    </p>
<?php else: ?>
    <!-- form to login -->
    <form method="POST">
        <p>
            <input type="email" name="email" placeholder="Enter email" required>
        </p>

        <p>
            <input type="password" name="password" placeholder="Enter password" required>
        </p>

        <p>
            <input type="submit" name="login" value="Login">
        </p>
    </form>
<?php endif; ?>

Daraufhin wird eine Schaltfläche zum Abmelden angezeigt, wenn der Administrator angemeldet ist, und ein Anmeldeformular, wenn ein Administrator nicht angemeldet ist. Jetzt schreiben wir den Code, um den Administrator anzumelden und seine Sitzung zu starten:

// check if request is for login
if (isset($_POST["login"]))
{
    // get email and password
    $email = $_POST["email"];
    $password = $_POST["password"];

    // check if email exists
    $result = mysqli_query($conn, "SELECT * FROM admins WHERE email="" . $email . """);
    if (mysqli_num_rows($result) > 0)
    {
        // check if password is correct
        $admin = mysqli_fetch_object($result);
        if (password_verify($password, $admin->password))
        {
            // start session
            $_SESSION["admin"] = $admin;
            echo "<p>Logged in.</p>";
        }
        else
        {
            echo "<p>Wrong password.</p>";
        }
    }
    else
    {
        echo "<p>Email not found.</p>";
    }
}

Dadurch wird zunächst überprüft, ob die E-Mail in der Datenbank vorhanden ist. Anschließend wird das Hash-Passwort mit dem Klartext aus dem Eingabefeld verglichen. Wenn die Anmeldeinformationen in Ordnung sind, wird das Administratorobjekt in der Sitzungsvariablen gespeichert. Jetzt sehen Sie die Abmeldeschaltfläche.

// check if request is for logout
if (isset($_GET["logout"]))
{
    // remove from session and redirect back
    unset($_SESSION["admin"]);
    header("Location: " . $_SERVER["HTTP_REFERER"]);
}

Wenn Sie auf die Schaltfläche zum Abmelden klicken, entfernen wir dieses Admin-Objekt aus der Sitzungsvariablen und leiten den Admin auf die Seite um, von der er stammt. Es gibt andere Methoden, um den Benutzer zur vorherigen Seite umzuleiten, und Sie werden diese Methoden überprüfen von hier.

Wenn der angemeldete Administrator ein Superadministrator ist, zeigen wir ihm ein Formular und fügen einen neuen Administrator hinzu:

<!-- check if main admin -->
<?php if ($_SESSION["admin"]->role == "all"): ?>

    <!-- add admin form -->
    <h1>Add admin</h1>
    <form method="POST">
        <p>
            <input type="email" name="email" placeholder="Enter email" required>
        </p>

        <p>
            <input type="password" name="password" placeholder="Enter password" required>
        </p>

        <p>
            <label>Enter role</label>
            <select name="role" required>
                <option value="all">All</option>
                <option value="manage_posts">Manage posts</option>
            </select>
        </p>

        <p>
            <input type="submit" name="add_admin" value="Add admin">
        </p>
    </form>
<?php endif; ?>

Hier werden Sie nach der E-Mail-Adresse und dem Kennwort des Administrators sowie nach der Rolle gefragt, die Sie ihm zuweisen möchten. Jetzt schreiben wir den Code, um seine Daten in der Datenbank zu speichern:

// check if request is for adding admin
if (isset($_POST["add_admin"]))
{
    // check if main admin
    if (isset($_SESSION["admin"]) && $_SESSION["admin"]->role == "all")
    {
        // get values
        $email = $_POST["email"];
        $password = password_hash($_POST["password"], PASSWORD_DEFAULT);
        $role = $_POST["role"];

        // check if email already exists
        $result = mysqli_query($conn, "SELECT * FROM admins WHERE email="" . $email . """);
        if (mysqli_num_rows($result) > 0)
        {
            echo "<p>Email already exists.</p>";
        }
        else
        {
            // save in database
            mysqli_query($conn, "INSERT INTO admins (email, password, role) VALUES ('" . $email . "', '" . $password . "', '" . $role . "')");
            echo "<p>Admin has been added.</p>";
        }
    }
    else
    {
        echo "<p>Sorry, you cannot perform this action.</p>";
    }
}

Zunächst wird überprüft, ob der angemeldete Administrator Zugriff haben muss, um einen Unteradministrator zu erstellen. Dann werden alle Felder abgerufen und das Nur-Text-Passwort in eine Hash-Zeichenfolge konvertiert. Anschließend wird überprüft, ob bereits ein Administrator mit derselben E-Mail-Adresse vorhanden ist. Andernfalls werden die Daten in der Datenbank gespeichert und eine Erfolgsmeldung angezeigt.

Jetzt müssen wir alle Superadministratoren dem Superadministrator anzeigen, damit er alle seine Subadministratoren mit ihren Rollen kennt und auch alle Subadministratoren löschen kann. Der folgende Code sollte nach dem Formular „Admin hinzufügen“ geschrieben werden:

<?php
    // show all admins
    $all_admins = mysqli_query($conn, "SELECT * FROM admins WHERE id != '" . $_SESSION["admin"]->id . "'");
    while ($admin = mysqli_fetch_object($all_admins)):
?>
    <p>
        <?php echo $admin->email . " - " . $admin->role; ?>

        <!-- button to delete admin -->
        <form method="POST" onsubmit="return confirm('Are you sure you want to delete ?');">
            <input type="hidden" name="id" value="<?php echo $admin->id; ?>">
            <input type="submit" name="delete_admin" value="Delete">
        </form>
    </p>
    <hr>
<?php endwhile; ?>

Dadurch werden alle Subadministratoren nur dem Superadministrator angezeigt. Wenn Sie auf die Schaltfläche Löschen klicken, werden Sie zunächst um Bestätigung gebeten. Nach der Bestätigung wird das Formular gesendet. Jetzt müssen wir die Formularübermittlung in PHP behandeln:

// check if request is for deleting admin
if (isset($_POST["delete_admin"]))
{
    // check if main admin
    if (isset($_SESSION["admin"]) && $_SESSION["admin"]->role == "all")
    {
        // get value
        $id = $_POST["id"];

        // delete from database
        mysqli_query($conn, "DELETE FROM admins WHERE id = '" . $id . "'");
        echo "<p>Admin has been deleted.</p>";
    }
    else
    {
        echo "<p>Sorry, you cannot perform this action.</p>";
    }
}

Dadurch wird einfach überprüft, ob der angemeldete Administrator ein Superadministrator sein muss. Dann wird der Administrator aus der Datenbank gelöscht. Wenn ein Unteradministrator gelöscht wird, werden auch alle von ihm erstellten Beiträge gelöscht. Wenn Sie möchten, dass die Beiträge des Unteradministrators nach dem Entfernen erhalten bleiben, müssen Sie die Klausel „ON DELETE CASCADE ON UPDATE CASCADE“ während der Erstellung aus der Tabelle „posts“ entfernen.

Nun kommen wir zum Sub-Admin-Teil. Subadministratoren können Aktionen basierend auf ihren Rollen ausführen. Beispielsweise kann ein Subadministrator mit der Rolle „manage_posts“ Beiträge erstellen, bearbeiten und löschen. Zuerst erstellen wir ein Formular, um einen Beitrag hinzuzufügen:

<!-- check if admin has permission to manage posts -->
<?php if ($_SESSION["admin"]->role == "all" || $_SESSION["admin"]->role == "manage_posts"): ?>
    <!-- form to add new post -->
    <h1>Add post</h1>
    <form method="POST">
        <p>
            <input type="text" name="title" placeholder="Enter title" required>
        </p>

        <p>
            <input type="submit" name="add_post" value="Add post">
        </p>
    </form>
<?php endif; ?>

Dadurch wird überprüft, ob der angemeldete Administrator entweder ein Superadministrator oder ein Administrator mit der Rolle „manage_posts“ sein muss. Jetzt müssen wir seine Anfrage in PHP bearbeiten:

// check if request is for adding post
if (isset($_POST["add_post"]))
{
    // check if admin has permission to manage posts
    if (isset($_SESSION["admin"]) && ($_SESSION["admin"]->role == "all" || $_SESSION["admin"]->role == "manage_posts"))
    {
        // get values
        $title = $_POST["title"];
        $created_by = $_SESSION["admin"]->id;

        // save in database
        mysqli_query($conn, "INSERT INTO posts (title, created_by) VALUES ('" . $title . "', '" . $created_by . "')");
        echo "<p>Post has been added.</p>";
    }
    else
    {
        echo "<p>Sorry, you cannot perform this action.</p>";
    }
}

Wir müssen die Subadministratorrolle auch auf der Serverseite überprüfen. Rufen Sie alle Felder aus den Eingabefeldern ab und melden Sie die Administrator-ID an, damit wir wissen, welcher Unteradministrator diesen Beitrag erstellt hat. Dann werden wir die Daten in die Datenbank einfügen.

Jetzt müssen wir alle von ihm erstellten Beiträge des Unteradministrators anzeigen, damit er weitere Aktionen wie das Aktualisieren oder Löschen von Beiträgen ausführen kann.

<?php
    // get all posts
    $all_posts = mysqli_query($conn, "SELECT * FROM posts WHERE created_by = '" . $_SESSION["admin"]->id . "'");
    while ($post = mysqli_fetch_object($all_posts)):
?>
    <p>
        <?php echo $post->title; ?>

        <!-- button to delete post -->
        <form method="POST" onsubmit="return confirm('Are you sure you want to delete ?');">
            <input type="hidden" name="id" value="<?php echo $post->id; ?>">
            <input type="submit" name="delete_post" value="Delete">
        </form>
    </p>
    <hr>
<?php endwhile; ?>

Dadurch werden alle vom angemeldeten Administrator erstellten Beiträge aus der Datenbank abgerufen und ihre Titel zusammen mit einer Schaltfläche zum Löschen angezeigt. Wenn das Löschformular gesendet wird, wird eine Bestätigung angefordert. Sobald die Bestätigung vorliegt, wird das Formular gesendet. Jetzt müssen wir die Formularanforderung auf der Serverseite bearbeiten:

// check if request is for deleting post
if (isset($_POST["delete_post"]))
{
    // check if admin has permission to manage posts
    if (isset($_SESSION["admin"]) && ($_SESSION["admin"]->role == "all" || $_SESSION["admin"]->role == "manage_posts"))
    {
        // get value
        $id = $_POST["id"];

        // check if post is created by logged in admin
        $result = mysqli_query($conn, "SELECT * FROM posts WHERE id = '" . $id . "' AND created_by = '" . $_SESSION["admin"]->id . "'");
        if (mysqli_num_rows($result) == 0)
        {
            echo "<p>Sorry you cannot perform this action.</p>";
        }
        else
        {
            // delete from database
            mysqli_query($conn, "DELETE FROM posts WHERE id = '" . $id . "' AND created_by = '" . $_SESSION["admin"]->id . "'");
            echo "<p>Post has been deleted.</p>";
        }
    }
    else
    {
        echo "<p>Sorry, you cannot perform this action.</p>";
    }
}

Wieder wird überprüft, ob der angemeldete Administrator entweder ein Superadministrator ist oder eine Rolle beim Verwalten von Posts hat. Außerdem wird geprüft, ob der Beitrag, den er löschen möchte, von ihm erstellt wurde. So wird es gesichert. Wenn alle Überprüfungen bestanden sind, wird der Beitrag einfach aus der Datenbank gelöscht.



[ad_2]