Auswertung eines Bit-Rechtesystems !?

The_real_Guru

Erfahrenes Mitglied
Habe jetzt ein Rechtesystem auf Bit-Basis gebaut und jetzt ein Problem bei der Auswertung der Rechte ;)

Folgende Rechte habe ich in Konstanten definiert:

PHP:
define(RIGHT_RED_ADD,				"1");
define(RIGHT_RED_EDIT,				"2");
define(RIGHT_RED_DEL,				"4");
define(RIGHT_NEWS_ADD,				"8");
define(RIGHT_NEWS_EDIT,				"16");
define(RIGHT_NEWS_DEL,				"32");
define(RIGHT_NEWS_APP,				"64");
define(RIGHT_NEWS_QUELL,			"128");
define(RIGHT_ART_ADD,				"256");
define(RIGHT_ART_EDIT,				"512");
define(RIGHT_ART_DEL,				"1024");
define(RIGHT_ART_APP,				"2048");
define(RIGHT_ART_CAT,				"4096");
define(RIGHT_ART_DIAG_ADD,			"8192");
define(RIGHT_ART_DIAG_EDIT,			"16384");
define(RIGHT_ART_DIAG_DEL,			"32768");
define(RIGHT_LEX_ADD,				"65536");
define(RIGHT_LEX_EDIT,				"131072");
define(RIGHT_LEX_DEL,				"262144");
define(RIGHT_DOWN_ADD,				"524288");
define(RIGHT_DOWN_EDIT,				"1048576");
define(RIGHT_DOWN_DEL,				"2097152");
define(RIGHT_LINK_ADD,				"4194304");
define(RIGHT_LINK_EDIT,				"8388608");
define(RIGHT_LINK_DEL,				"16777216");

Jetzt hat ein User z.B. als Rechte die "23" ... wie kann ich jetzt auflisten, welche Rechte er besitzt?

.guru
 
Ich bin zwar nicht der Guru in dem Thema aber ich denke direkt darstellen kann man das nicht. Du kannst aber abfragen ob ein einzelnes Recht vorhanden ist.
PHP:
function has_permission ($needle, $pool)
{
  return ($needle & $pool) ? true : false;
}
Damit könntest du also rein theoretisch also mit einer Schleife alle existierenden Rechte durchgehen und für jedes einzeln herausfinden, welches Recht der Benutzer hat.
 
Hmm,

etwas uneffizient, aber man könnte die Rechte ja auch in einem Array speichern:

PHP:
$rightArr = array (
   "RIGHT_RED_ADD" =>   "1", 
   "RIGHT_RED_EDIT" =>   "2", 
   "RIGHT_RED_DEL" =>    "4"
); 

foreach($rightArr as $key => $value) {
   if($value & $userRights) {
      echo "User hat Recht ".$key."<br>";
   }
}

Oder du speicherst nur die Namen der Konstanten, wobei ich mir nicht sicher bin, ob folgender Code funktioniert:

PHP:
/*
* Rechte setzen
*/
define(RIGHT_RED_ADD,                "1"); 
define(RIGHT_RED_EDIT,                "2"); 
define(RIGHT_RED_DEL,                "4");

/*
* Texte für die Ausgabe pro Bit setzen
*/
$rightLangArr = array (
   RIGHT_RED_ADD => "Recht XY",
   RIGHT_RED_EDIT => "Recht zzzz",
   RIGHT_RED_DEL => "Recht abc"
);

/*
* Namen der rechte in ein Array speichern
*/
$rightArr = array (   "RIGHT_RED_ADD",  "RIGHT_RED_EDIT", "RIGHT_RED_DEL" ); 

foreach($rightArr as $value) {
   /* 
   * Kritischer Punkt: funktioniert {$$value}? es soll nicht 
   * der Name des Rechts sondern das Bit da stehen, deshalb $$ 
   */
   if( {$$value} & $userRights ) {
      echo "User hat Recht".$rightLangArr[$$value]." <br>";
   }
}

Ach übrigens: definier mal die Bits lieber so, ist übersichtlicher:

PHP:
/*
* Rechte setzen
*/
define(RIGHT_RED_ADD,  1 << 0); 
define(RIGHT_RED_EDIT, 1 << 1); 
define(RIGHT_RED_DEL,  1 << 2);

Damit verschiebst du Bits (also in diesem Fall das 1.) um x stellen (hier nach links, >> gibt es auch). Du setzt also das Nullte Bit für RIGHT_RED_ADD, das 1. Bit für .... usw.

Ciao, Jörg

Ciao, Jörg
 
Zuletzt bearbeitet:
Zurück