Rechtesystem mit verschiedenen Benutzergruppen

Spacedoener

Gesperrt
Hi,

habe ein großen Problem und würde mich echt sehr freuen, wenn ihr mir da Helfen könntet.

Habe ein Login Script aus dem Tutorials "[PHP/mySQL] Login-System mit Sessions" kopiert und wollte mir den weiteren Script aus der Tutorials "Rechtesystem mit verschiedenen Benutzergruppen" in diesem einbinden...

Aber die beschreibungen und erklärungen sind sehr grob beschrieben und irgendwie funktioniert das ganze nicht.
Bitte bitte so helft mir, brauche dringend da mal Hilfe...

Das ganze sieht so aus:

script.php:
PHP:
<?php
// Definition der Benutzer
$benutzer[0]["Nickname"] ="admin";
$benutzer[0]["Kennwort"] = "admin";
$benutzer[0]["Nachname"] = "Voll zugriff";
$benutzer[0]["Vorname"] = "Max";
$benutzer[0]["checkright"] = "7";

$benutzer[1]["Nickname"] = "test0";
$benutzer[1]["Kennwort"] = "abc";
$benutzer[1]["Nachname"] = "keine rechte";
$benutzer[1]["Vorname"] = "test0";
$benutzer[1]["checkright"] = "0";

$benutzer[2]["Nickname"] = "test1";
$benutzer[2]["Kennwort"] = "abc";
$benutzer[2]["Nachname"] = "Schreiben";
$benutzer[2]["Vorname"] = "test1";
$benutzer[2]["checkright"] = "1";

$benutzer[3]["Nickname"] = "test2";
$benutzer[3]["Kennwort"] = "abc";
$benutzer[3]["Nachname"] = "Bearbeiten";
$benutzer[3]["Vorname"] = "test2";
$benutzer[3]["checkright"] = "2";

$benutzer[4]["Nickname"] = "test4";
$benutzer[4]["Kennwort"] = "abc";
$benutzer[4]["Nachname"] = "löschen";
$benutzer[4]["Vorname"] = "test4";
$benutzer[4]["checkright"] = "4";

// Sie können an dieser Stelle beliebig viele Benutzer anlegen.
// Achten Sie dabei nur auf die Fortführung der Nummer.

// Aufbau der Datenbankverbindung
$connectionid = mysql_connect ("localhost", "root", "01039052");
if (!mysql_select_db ("LoginSystem", $connectionid))
{
  die ("Keine Verbindung zur Datenbank");
}

// Zuerst alle Datensätze löschen um keine Dopplungen zu bekommen.
mysql_query ("DELETE FROM benutzerdaten");

// Daten eintragen
while (list ($key, $value) = each ($benutzer))
{
  // SQL-Anweisung erstellen
  $sql = "INSERT INTO ".
    "benutzerdaten (Nickname, Kennwort, Nachname, Vorname, checkright) ".
  "VALUES ('".$value["Nickname"]."', '".
                       md5 ($value["Kennwort"])."', '".
                       $value["Nachname"]."', '".
                       $value["Vorname"]."', '".
                       $value["checkright"]."')";
  mysql_query ($sql);

  if (mysql_affected_rows ($connectionid) > 0)
  {
    echo "Benutzer erfolgreich angelegt.<br>\n";
  }
  else
  {
   echo "Fehler beim Anlegen der Benutzer.<br>\n";
  }
}
?>

</body>
</html>


login.php
PHP:
<?php
// Session starten
session_start ();

// Datenbankverbindung aufbauen
$connectionid = mysql_connect ("localhost", "root", "01039052");
if (!mysql_select_db ("LoginSystem", $connectionid))
{
  die ("Keine Verbindung zur Datenbank");
}

$sql = "SELECT ".
    "Id, Nickname, Nachname, Vorname, checkright ".
  "FROM ".
    "benutzerdaten ".
  "WHERE ".
    "(Nickname like '".$_REQUEST["name"]."') AND ".
    "(Kennwort = '".md5 ($_REQUEST["pwd"])."')";
$result = mysql_query ($sql);

if (mysql_num_rows ($result) > 0)
{
  // Benutzerdaten in ein Array auslesen.
  $data = mysql_fetch_array ($result);

  // Sessionvariablen erstellen und registrieren
  $_SESSION["user_id"] = $data["Id"];
  $_SESSION["user_nickname"] = $data["Nickname"];
  $_SESSION["user_nachname"] = $data["Nachname"];
  $_SESSION["user_vorname"] = $data["Vorname"];
  $_SESSION["user_checkright"] = $data["checkright"];

  header ("Location: intern.php");
}
else
{
  header ("Location: formular.php?fehler=1");
}
?>

formular.php
PHP:
<?php session_start (); ?>
<html>
<head>
  <title>Login</title>
</head>

<body>
<?php
if (isset ($_REQUEST["fehler"]))
{
  echo "Die Zugangsdaten waren ungültig.";
}
?>
<form action="login.php" method="post">
  Name: <input type="text" name="name" size="20"><br>
  Kennwort: <input type="password" name="pwd" size="20"><br>
  <input type="submit" value="Login">
</form>
</body>
</html>

checkuser.php

PHP:
<?php
session_start ();
if (!isset ($_SESSION["user_id"]))
{
  header ("Location: formular.php");
}
?>

logout.php
PHP:
<?php
// Wird ausgeführt um mit der Ausgabe des Headers zu warten.
ob_start ();

session_start ();
session_unset ();
session_destroy ();

header ("Location: formular.php");
ob_end_flush ();
?>

intern.php
PHP:
<?php
include ("checkuser.php");

?>
<html>
<head>
  <title>Interne Seite</title>
</head>
<body>
  BenutzerId: <?php echo $_SESSION["user_id"]; ?><br>
  Nickname: <?php echo $_SESSION["user_nickname"]; ?><br>
  Nachname: <?php echo $_SESSION["user_nachname"]; ?><br>
  Vorname: <?php echo $_SESSION["user_vorname"]; ?><br>
  Checkright: <?php $_SESSION["user_checkright"];?>
  <hr>
  
  <?php
  
    function checkright($userrank,$righttocheck)
    {
        if(($userrank & $righttocheck) == $righttocheck)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    

    $recht[0] = 0;    // 0001 (hier wird noch nicht geshiftet!)
    $recht[1] = 1;    // 0001 (hier wird noch nicht geshiftet!)
    $recht[2] = 1<<1; // 0010 (0001 um 1 nach links: 0010);
    $recht[3] = 1<<2; // 0100 (0001 um 2 nach links: 0100);
    $recht[4] = 1<<3; // 1000 (0001 um 3 nach links: 1000);
    
    
    
    $RechteKeyDesUsers = $_SESSION["user_checkright"];

    $RightToCheck = $recht[4];

    if(checkright($RechteKeyDesUsers,$RightToCheck))
    {
      //alles ok
      echo "<br>okay";
    }
    else
    {
     //nix ok
      echo "<br>nicht okay";
    }
    
  ?>
  <a href="logout.php">Ausloggen</a>
</body>
</html>


So das war das ganze, ich hoffe es kommt nicht viel auf einmal vors auge...
Aber die meisten änderungen ist bei den letzten script gemacht worden, also in "intern.php" ...

Würde mich echt sehr freuen, wenn hier einer mir dabei Helfen könnte und mir schreibt wie ich es machen soll, habe da keine peilung mit...

MfG
Spacedoener
 
Ich nehme mal das Login klappt soweit, nur dass er dann auf der intern.php immer "nicht okay" anzeigt, oder?
Ich denke der Fehler liegt in der checkright-Funktion, änder sie doch mal auf:
PHP:
function checkright($userrank,$righttocheck)
{
  return ($userrank & $righttocheck) ? true : false;
}
 
Original geschrieben von Karl Förster
Ich nehme mal das Login klappt soweit, nur dass er dann auf der intern.php immer "nicht okay" anzeigt, oder?
Ich denke der Fehler liegt in der checkright-Funktion, änder sie doch mal auf:
PHP:
function checkright($userrank,$righttocheck)
{
  return ($userrank & $righttocheck) ? true : false;
}


Hi,

dankeschön für deinen Antwort...

Ja Login funktioniert astrein...
Die User können sich ganz normal einlogen und auch wieder auslogen...
Nur die Rechtevergabe funktioniert nicht richtig...

Also zu deiner Idee mit der Funktion....
Das hat doch eh kein unterschied von dem alten.
Ist doch der selbe wie vorher auch, nur andere schreibweise (kürzer)...
Mehr nicht...

Ich habe es aber trotzdem getestet, es funktioniert nicht, egal mit was ich mich einlogge, es kommt immer "nicht okay" ...

Was muss ich tun, was mache ich falsch, vom Theorie her was im Tutorials steht verstehe ich perfekt, aber leider haben die jenigen es sehr grob und sehr Anfänglich beschrieben, so dass man es nicht in PHP umsetzten kann...
z.B. der Tutorials "[PHP/mySQL] Login-System mit Sessions" ist dagegen perfekt erklärt worden so das man es nach voll ziehen kann...

Freue mich auf jede kleine Hilfe...

MfG
Spacedoener
 
Halt ! Moment ! Stop !
PHP:
return ($userrank & $righttocheck) ? true : false;
//ist nicht gleichwertig mit
if(($userrank & $righttocheck) == $righttocheck)
Ein Bitweises Und gibt doch nicht true oder false zurück sondern das Ergebnis, des Bitweis-Und.. Ausserdem musst du ja so überprüfen, ob das zu prüfende Recht in dem Schlüssel des Users enthalten ist. Deshalb ist die true/false Methode meiner Meinung nach schlichtweg Quark.

Ich weise nochmals darauf hin, dass die Variablen $userrank und $righttocheck unbedingt vom typ Integer sein müssen. Bitte mit gettype() überprüfen und zur not mit settype() ändern, denn nicht jede Zahl ist wirklich als Zahl-Variable deklariert und dann kommt wirklich NUR Schwachsinn dabei raus.

so dass man es nicht in PHP umsetzten kann...
Die von mir in dem Tutorial angegebene Funktion läuft unter Beachtung des (farblich hervorgehobenen) Updates meines Textes bei mir einwandfrei. Ich sehe das Problem nicht so ganz.
 
Zuletzt bearbeitet:
Mhh wüsste aber auch nicht was an der true/false variante falsch sein sollte? Bei mir klappt das einwandfrei. In meinem Rechtesystem gibt es die folgende Funktion:
PHP:
function has_permission ($needle, $permissions)
{
  return ($needle & $permissions) ? true : false;
}
Ich habe dann z.B. die Rechte 1, 2 und 4 und in der Datenbank 6 stehen. Dann frag ich ab:
PHP:
if (has_permission (2, 6))
{
  echo "alles ok";
}
else
{
  echo "alles schei...";
}
 
Original geschrieben von Karl Förster
Mhh wüsste aber auch nicht was an der true/false variante falsch sein sollte? Bei mir klappt das einwandfrei. In meinem Rechtesystem gibt es die folgende Funktion:
PHP:
function has_permission ($needle, $permissions)
{
  return ($needle & $permissions) ? true : false;
}

Ich habe dann z.B. die Rechte 1, 2 und 4 und in der Datenbank 6 stehen. Dann frag ich ab:
PHP:
if (has_permission (2, 6))
{
  echo "alles ok";
}
else
{
  echo "alles schei...";
}


Hi Karl Förster,

dankeschön für deine Hilfe...
Bin dir sehr dankbar, denn es funktioniert wirklich, hattest recht...
Beide Funktionen klappen, ist der ein und das selbe, also hatte ich ja da oben auch recht gehabt, dass es die selbe funktionen sind... :)

Tim Comanns, möchte für deine Hilfe auch sehr danken, es funktioniert jetzt *freu...

MfG
Spacedoener
 
Könnte jemand nochmal den kompletten quelltext posten, kriege das irgendwie nicht hin, danke im vorraus, oemel



EDIT: Sorry, hat sich erledigt, mein Problem hat sich gelöst, wollte nicht spammen.
 
Zuletzt bearbeitet:
zu dem bitweisen UND:

es stimmt, es wird das Ergebnis zurück geliefert. Wenn eine der beiden Variablen aber nur 1 einziges Bit repräsentiert (also zB der Wert 1, 2, 4 oder so), dann wird als Ergebnis die Bitliste zurückgeliefert, die in beiden Variablen gleichzeitig enthalten ist. Wenn das zu prüfende Bit in der Linken Variable kodiert ist und in der rechten eine Bitliste gegen die geprüft wird und in der rechten das bit nicht gesetzt ist, kommt 0 raus. Alles was nicht 0 ist ist für PHP true.

So, hoffe ich habe das richtig so verstanden, ansonsten bin ich froh, das meine ganzen bitlistenbasierten Systeme so gut funktionieren.

Ciao, Jörg
 
Zuletzt bearbeitet:
Zurück