User rechte

  • Moin,


    ich muss leider nochmals etwas fragen. Auf meiner Seite können sich User einlogge, die passende Funktion sieht so aus:



    Die Datenbank dazu sieht so aus:



    Bestimmte Seiten werden bei mir so geschützt


    PHP
    <?php
    if(isUserLoggedIn($mysqli) === FALSE) {
    	header('Location: login');
    } 
    ?>


    Die Frage dazu ist nun, ist es möglich ohne viel Aufwand die Funktion etwas abzuändern und zwar dass geprüft wird was im Feld "user_type" steht, hier kann entweder admin oder user stehen. ich möchte gerne ein paar Seiten nur für den Administrtoren zugänglich machen.


  • Da gibts sicherlich noch Sachen, de Du in paar Wochen/Monaten anders machen wirst =)
    Aber ich will Dich jetzt nicht mit Verbesserungsvorschlägen überennen.
    Nur kurze Hinweise:

    SQL
    ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;


    solltest Du ändern in AUTO_INCREMENT=1 anstatt AUTO_INCREMENT=17

    SQL
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


    Warum:
    AUTO_INCREMENT=17 gibt an, dass die fortlaufende id mit 17 beginnt.
    Der erste Eintrag hätte also die id 17, anstatt 1.


    Wo wir bei der id sind - da gibts keine.
    Du kannst sicherlich die user_id als fortlaufende id nutzen:

    SQL
    `user_id` int(10) NOT NULL AUTO_INCREMENT, -- NEU: AUTO_INCREMENT
    -- ...
      `user_ip` varchar(50) NOT NULL, -- NEU: das komma nicht vergessen
        PRIMARY KEY (`user_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


    Du könntest auch den `user_type` auf enum setzen. Der wird ja sicherlich nur admin und user enthalten.


    Wichtig für die Sicherheit: Du speicherst Passwörter im Klartext (cleartext) in der db. Das ist ganz schlecht =)
    Wenn Du irgendwann Zeit und Lust hast, sie Dir das mal an: Loginpasswort richtig hashen - password_hash() & password_verify()

  • Danke für deine Hilfe, den PHP Code gehe ich gleich durch ich möchte nur auf deine Anmerkungen etwas sagen.


    Zitat

    Wichtig für die Sicherheit: Du speicherst Passwörter im Klartext (cleartext) in der db. Das ist ganz schlecht =)


    Mach ich nicht :) Mein Passwort steht so in der Datenbank, ich kann also nicht sehen, was das bedeutet:
    ab6f7ca0630b012698dda6a5a11d8035


    Zitat

    Du könntest auch den `user_type` auf enum setzen. Der wird ja sicherlich nur admin und user enthalten.


    Ok, werde ich gleich ändern, hat das Vor- bzw. Nachteile?


    Zitat

    Der erste Eintrag hätte also die id 17, anstatt 1.


    Wenn ich meine Datenbank komplett lösche, dann fängt er auch bei 0 an zu zählen, ich habe heute nur einige Tests schon gemacht und immer wieder gelöscht :)
    Hallo,


    ich habe noch eine Frage zu diesem Aufruf:


    PHP
    / aufruf:
        // isUserLoggedIn($mysqli, 'admin')
        // isUserLoggedIn($mysqli, 'user')


    Das würde also mein Aufruf, der jetzt so aussieht, ersetzten?


    PHP
    if(isUserLoggedIn($mysqli) === FALSE) {
    	header('Location: login');
    }


    Das "=== FALSE" kann also weg? Kann ich auch beide einfügen, also USer und Admin, denn ein Admin darf selbstverständlich auch die Userseiten aufrufen :)

  • zu den pws: ok, sieht dann aber aus wie ein md5 hash. Wie gesagt - lies Dir die Posts bei Gelegenheit mal durch. Wir hatten das Thema "password hashen" dort gemeinsam auseinander genommen.
    zu user_type enum: naja, mein weiß zB auf Anhieb was da erwartet werden kann.
    Später kannst Du dann noch einen TINYINT daraus machen.
    `user_type` wäre dann ein Fremdschlüssel auf eine Tabelle `user_types`.
    Diese enthält dann

    Code
    id   | type
    1    | admin
    2    | user
    3    | banned(?)
    ...


    Aber wie gesagt - will Dich damit nicht überrennen.


    zu id 17: dann hast Du sicherlich das create-Statement kopiert (copy create-statement oder so) und hattest schon 17 Zeilen drin :D


    zu Aufruf: nein
    Deine Funktion hat einen neuen Parameter bekommen: $user_type
    wenn Du 'user' reinschickst, dann "sucht die Query" ja WHERE user_type = ?
    Abfrage für admin:

    PHP
    if(isUserLoggedIn($mysqli, 'admin') === FALSE) {
        // ist NICHT admin
    }


    Abfrage für user:

    PHP
    if(isUserLoggedIn($mysqli, 'admin') === FALSE) {
        // ist NICHT user
    }


    Erneute Änderung:


    jetzt geht auch:
    Abfrage für login:

    PHP
    if(isUserLoggedIn($mysqli) === FALSE) {
        // user/admin ist NICHT eingeloggt
    }
  • Danke für deine Ausführliche Erklärung, ich werde das gleich mal einbauen. Ich hoffe dass ich das richtig geschrieben habe ïŠ


    Es gibt ja den Status User und Admin. Wenn ein Admin eingeloggt ist, der darf selbstverständlich auch auf User Seite zugreifen, ein User darf aber NICHT auf eine Admin Seite zugreifen. Ich kann das leider nicht an der Funktion erkennen bzw. verstehe die nicht richtig.

  • Ich versuchs mal so:

  • Dann habe ich allerdings ein Denkfehler, denn du schreibst ja selber „achtung - hier würdest du den admin ausschließen, denn der ist ja nicht vom user_type "User"“


    Ich wollte ja erreichen, dass wenn der Status Admin gesetzt ist, darf dieser auf ALLE Seite nur wenn der Status „User“ ist, muss eine Einschränkung kommen und zwar, dass diese nicht auf User Seite dürfen.


    Scheint doch alles zu kompliziert sein :/

  • Wenn Du

    PHP
    if(isUserLoggedIn($mysqli) === true) // beachte hier true


    nutzt, dann kann jeder rein, der eingeloggt ist -- also Admin und User. (Bsp index.php/html)


    Adminbereich:

    PHP
    if(isUserLoggedIn($mysqli, 'Admin') === true)


    Eigtl würde ich persönlich mit einer Funktion den Benutzer laden

    SQL
    "SELECT * FROM web_users WHERE user_session=? -- weiß nicht für was session steht"


    und dann in eine Variable packet -- zB $user oder $current_user.
    Dann könntest Du (mit nur einer Query) prüfen:
    ist user vom typ "User", oder "Admin", ist er eingeloggt, ...

Jetzt mitmachen!

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