• Guten Tag,


    ich habe derzeit ein Interface am laufen und habe ein kleines Problem.


    Es gibt 1x ein User Interface und 1 Admin Interface


    User = /interface/dashboard.php

    Admin /interface/admin/dashboard.php



    In der Datenbank werden User als "u_user" und Admins als "a_user" gespeichert.



    Mein Problem. Wenn ich mich als User einlogge /interface/dashboard.php lande ich normal auf der Seite.

    Wenn ich aber /interface/admin/dashboard.php mache lande ich im Admin Interface.



    Genau das möchte ich allerdings nicht.


    Kann man das Irgendwie verhindern?



    Gruß!

  • Z.b. in dem du den Status nicht im User verwurstelst. Sondern ein separates Feld dafür vorsiehst.

    Das kannst du beim Login mit abfragen und in der Session speichern.

    Dann musst du auf der Seite nur noch abfragen.


    Vereinfacht gesagt:

    Du hast 2 Arten an Usern, normale User und Admins.

    Dann steht in der Datenbank:

    User Admin

    cloud 1

    Fred 0


    Auf der Seite brauchst du dann nur noch den Wert mit if abfragen und die Seite darstellen oder eben nicht.


    Wenn du mehrere Userarten hast solltest du mal einen Blick auf das Binärsystem werfen.


    Gruß Humbi

  • Hey,


    was du machen kannst ist, wenn sich ein User einlogt, eine Session zu erstellen mit der ID des Users. Nun hast du in deiner Datenbank den Rang des Users stehen. Nun ziehst du diesen ebenso aus der DB raus und überprüfst den. Wenn der Rang Admin ist leitest du den User auf /interface/admin/dashboard.php um und wenn nicht dann auf /interface/dashboard.php.


    Auf den ganzen Adminseiten muss dann auch noch eine Überprüfung erfolgen. Sonst kann jeder User über die URL auf den adminbereich zugreifen.


    Grüße,

    Stef

  • Ich würde die Admintabelle streichen, die verursacht nur durcheinander bei den Abfragen.

    Deine Usertabelle könnte so aussehen:

    id username pw (gehasht)
    email admin
    1 CuzImCloud wertgzhujik admin@example.com 1
    2 Stef dfghjkl user@example.com 0


    Dann überprüfst du das Passwort

    $sql="SELECT `id`, `passwort` FROM table WHERE `username` LIKE ?";

    if(password_verify("$eingegebenespw", "$hashausdb")


    Wenn das Passwort stimmt, würde ich anhand der id den Rest auslesen und den Rechtewert sowie user in einer Sessionvariable speichern.

    Sicherlich kann man auch alles auf einmal auslesen oder das Passwort direkt in der query prüfen.


    Wieviele Nutzer willst du denn verwalten?


    Gruß Humbi

  • Beispiel:


    Code (ungetestet) :

    Die DB-Tabelle würde dann so aussehen:

    userId username email passwordHash rank
    1 Stef stef@gmail.com aeb319838893dndfnfnfnf admin
  • Da ich ja 2 Tabellen habe habe ich 1x die Admin Tabelle und User Tabelle gscreenshotet und 1x die Login für User und 1x die Login für Admins.



    Nicht wundern wegen .txt - .php kann man nicht hochladen.



    Gruß!

  • Also, Tutorials gibt es zu dem Thema massenhaft. Daher verstehe ich nicht so ganz, warum du da nichts Passendes finden kannst.


    Beispieltabelle:



    Und ein Beispielscript zur Überprüfung des Logins:

    In jedem Script, dass nur für den Admin bestimmt ist, schreibst du an den Anfang:

    PHP
    <?php
       session_start();
       
       if (! isset($_SESSION['isadmin']) || ! $_SESSION['isadmin'])
       {
           header ("Location: url_zum_user_bereich_oder_login");
           exit;
       }
    ?>


    Das ist natürlich alles nicht getestet, aber das Prinzip sollte klar werden.

  • Zitat von Humbi

    Sicherlich kann man auch alles auf einmal auslesen oder das Passwort direkt in der query prüfen.

    Was auch effektiver wäre.

    NEIN. Kein PW in der SQL-query prüfen. Das würde mit md5 zB funktionieren. Aber md5 nimmt man NICHT.

    Via password_hash werden immer unterschiedliche Hashes erstellt (liegt am Salt im Hash). Und die Prüfung ist nicht valide.


    Zitat von Humbi

    $sql="SELECT `id`, `passwort` FROM table WHERE `username` LIKE ?";

    Never LIKE!

    Du willst ganz sicher nicht einen User laden, der einen ähnlichen Namen hat.

    Auch wenn hier die PLatzhalter % fehlen - LIKE gehört hier nicht hin.



    Note: bei solchen Queries sollte man die Abfrage limitieren.

    SQL
    SELECT `id`, `passwort` FROM `table` WHERE `username` = :username LIMIT 1;

    LIMIT 1 und abschließendes ;

    Das LIMIT schließt von der Query her schon mal aus, dass Du (aus welchem Grund auch immer) Mehrere User mit dem gleichen Namen bekommst.

    Name sollte ja sicherlich einzigartig sein. Sollte also aus irgend einem Grund ein zweiter User den gleichen Namen registrieren können, wird er ignoriert.

    Denn wer zuerst kam, wird geladen (wenn default id ASC geladen wird).

    Man könnte natürlich auch ohne LIMIT laden und per PHP prüfen, ob es mehrere im Ergebnis gibt - und dann Alarm schlagen. Aber das gehört denk ich nicht in den Login.


    Bitte keine Daten direkt in die Query schreiben.

    Vergiss mysqli_real_escape_string.

    http://php.net/manual/de/mysql…1-mysqli.prepare-examples



    Zum Thema:

    Eine Tabelle ist wirklich genug.

    Von dem, was ich gesehen habe, kannst Du die zusammen legen.

    Nur bei den Admins setzt Du dann (wir bereits erwähnt wurde) ein Feld isAdmin mit dem Wert 1.


    Du könntest auch statt isAdmin ein Feld user_group_id hinzufügen.

    Der Wert verweist dann auf eine Neue Tabelle user_group.

    Bsp:

    Aber das erstmal nur so eingeworfen. Ist im Moment evtl Overkill.

  • Never LIKE!

    Du willst ganz sicher nicht einen User laden, der einen ähnlichen Namen hat.

    Dann ist ja gut, dass ich das aus dem Kopf geschrieben hab und in meinen Projekten bisher Where = verwendet hab.

    Auch hab ich noch kein Passwort in der Query geprüft.


    Ich dachte mir nur, meine Abfrage sieht so viel aus, das geht bestimmt schneller, besser.

    Aber ich hab auch mal was richtig gemacht. :)


    Danke für den Hinweis!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!