Guten Abend!
Ich habe das komplette System nochmals überarbeitet und optimiert. leider funktioniert das gnaze noch nicht wirklich und daher möchte ich euch zunächst das neue System vorstellen und euch dann um Hilfe bitten.
Wie schon zuvor soll es zwei Tabellen, eine für die User-Daten und eine für die Daten der "privaten" Bereiche geben. Die User-Tabelle enthält also im einfachsten Fall
id |
name |
password |
permissions. Die Tabelle für die "priavten" oder einfacher gesagt, für die geschützten Bereiche, enthält allerdings nun nur noch den
Namen des Bereichs und eine zugehörige
ID.
Wie findet man allerdings nun mit dem binären Wert aus der Permissions-Spalte der User Tabelle heraus, ob ein Benutzer zugriff auf einen bestimmten Bereich hat oder nicht? Oder auf welche Bereiche er überhaupt zugriff hat? Die Lösung ist eigentlich einfach. Nimmt man die ID für einen bestimmten bereich in zum Beispiel einem CM-System und nutzt diesen als Exponent zur Basis zwei, so erhält man den binären Wert, den der User als Teil seines binären Wertes besitzen muss.
Möchte man nun also alle IDs der Bereiche herausfinden, zu denen ein User Zugriff besitz, kann man dies relativ einfach auszählen. Ein Beispiel:
Es gibt die Bereiche
bla(
ID 1),
lol(
ID 2),
omg(
ID 3) und
nop(
ID 4).
Möchte nun jemand zum Beispiel den benötigten Binärwert zu
bla wissen, muss er nur 2^ID(lol) = 2^2 = 4 rechnen.
Möchte man also alle Bereiche wissen, zu denen ein Benutzer Zugriff besitzt, muss man einfach nur nach dem größten möglichen Exponenten zur Basis zwei suchen, bei dessen Subtraktion vom binären Permissions-Wert des Users nicht null herauskommt. Man durchläuft also eine Schleife solange, bis kein Restwert der Permissions mehr da ist. Gibt es also einen Nutzer
Klaus mit dem binären Permissions-Wert
20 in meinem oben begonnenen pseudo CM-System, so setzen sich seine Werte wie folgt zusammen.
P(
Klaus) = 2^
ID(
nop) + 2^
ID(
lol)
Der Benutzer Klaus hat also Zugriff auf die Bereiche nop und lol.
In PHP kann man dies, wie schon gesagt mit einer Schleife leicht errechnen.
- Code: Alles auswählen
// permissions of Klaus
$perms = 20;
//start counter
$i = 0;
// initiate array of ids
$mods = array();
// extrahate specific permissions
do
{
if( (($p-pow(2,$i)) < 0) )
{
$e = $i-1;
$p = $p-pow(2,$e);
$mods[] = $e;
$i = 0;
}
else
{
$i++;
}
}
while( (($p-pow(2,$i)) < 0) && ($p > 0) )
Nach Durchlaufen der Schleife enthält das Array
$mods alle IDs zu den geschützten bereichen zu denen Klaus Zutritt besitzt, also 2 und 4.
Ich hoffe, dass das neue System klar geworden ist. Bei Fragen stehe ich natürlich gerne zur Verfügung und für Anregungen bin ich auch immer offen.
Doch, wie schon gesagt, funktioniert die umgeschriebene Klasse noch nicht ganz. Es tritt folgender Fehler auf und ich finde ihn einfach nicht, wodurch ich die Klasse auch noch nicht testen konnte.
- Code: Alles auswählen
Parse error: syntax error, unexpected T_RETURN, expecting ';' in /home/www/web193/html/permissions.php on line 180
Ich hoffe mir kann jemand helfen. Ich wäre sehr dankbar. Die betreffende Zeile ist übrigens die mit der
while()-Schleife in der
getPerms()-Methode.
MfG, Andy
Übersicht über die Methoden__construct() - Setzt die wichtigen Variablen
addMod() - Fügt einen geschützten Bereich hinzu
delMod() - Entfernt einen geschützten Bereich
getMods() - Gibt die IDs aller geschützter bereiche zurück
getPerms() - Gibt die IDs zu den Bereichen zu denen ein Benutzer Zutritt besitzt zurück
addUser() - Fügt einen Benutzer hinzu
check() - Überprüft die Zutritts-Berechtigung eines Nutzers
getId() - Gibt die ID zu einem Bereich oder einem Nutzer anhand der ID oder des Namens zurück
Permissions.php- Code: Alles auswählen
<pre>
<?php
error_reporting(E_ALL);
/***
* The Permissions class allows reading and editting access rights
*
* @package Permissions
* @version 0.3
* @author Andreas Wilhelm <Andreas2209@web.de>
* @copyright Andreas Wilhelm
**/
class Permissions
{
// private class variables
private $db;
private $userTab;
private $modTab;
/**
* Constructor - Is called when the class is instanced
*
* @access public
* @param Obj $db
* @param Str $userTab
* @param Str $modTab
* @return NONE
*/
public function __construct(mysqli $db, $userTab, $modTab)
{
// save parameters to class variables
$this->db = $db;
$this->modTab = trim($modTab);
$this->userTab = trim($userTab);
}
/**
* addMod() - Adds a new protected section
*
* @access public
* @param Str $name
* @return Boolean
*/
public function addMod($name)
{
// add new section
$sql = "INSERT INTO {$this->modTab}
(`id`, `name`)
VALUES
('', '{$name}')";
// send sql-query
$this->db->query($sql);
// check result
if($this->db->affected_rows <= 0)
{
throw new Exception("Cannot create section {$name}.");
}
return true;
}
/**
* delMod() - Deletes section from table
*
* @access public
* @param Mix $ident
* @return Boolean
*/
public function delMod($ident)
{
// get id of the section
$id = $this->getId($ident, $this->modTab);
// delete section
$sql = "DELETE
FROM
{$this->modTab}
WHERE
'id' = '{$id}'";
// send sql-query
$this->db->query($sql);
// check result
if($this->db->affected_rows <= 0)
{
throw new Exception("Cannot delete {$id}.");
}
return true;
}
/**
* getMods() - Returns all section-ids
*
* @access public
* @return Array
*/
public function getMods()
{
// get section-ids
$sql = "SELECT
*
FROM
{$this->modTab}";
// send sql-query
$result = $this->db->query($sql);
// check result
if(!$result)
{
throw new Exception("Cannot get sections.");
}
// save perms to array
$mods = array();
$i=0;
while( $row = $result->fetch_assoc() )
{
$mods[$i]['id'] = $row['id'];
$mods[$i]['name'] = $row['name'];
$i++;
}
return $mods;
}
/**
* getPerms() - Returns all rights of an user
*
* @access public
* @param Mix $ident
* @return Array
*/
public function getPerms($ident)
{
// get id of the user
$id = $this->getId($ident, $this->userTab);
// get permissions of the user
$sql = "SELECT
`perm`
FROM
{$this->userTab}
WHERE
'id' = '{$id}'";
// send query
$result = $this->db->query($sql);
// check result
if(!$result)
{
throw new Exception("Cannot get permissions of user {$userId}.");
}
// save perms to array
$user = $result->fetch_assoc();
// save perms to integer
$p = $user['perm'];
//start counter
$i = 0;
// initiate array of ids
$mods = array();
// extrahate specific permissions
do
{
if( (($p-pow(2,$i)) < 0) )
{
$e = $i-1;
$p = $p-pow(2,$e);
$mods[] = $e;
$i = 0;
}
else
{
$i++;
}
}
while( (($p-pow(2,$i)) < 0) && ($p > 0) );
return $mods;
}
/**
* addUser() - Updates the permissions of an user
*
* @access public
* @param Arr $fields
* @param Arr $values
* @return Boolean
*/
public function addUser($fields = array(), $values = array())
{
if(count($fields) == count($values))
{
$fields = !empty($fields) ? '`' . implode('`, `', $fields) . '`' : '';
$values = !empty($values) ? '\'' . implode('\', \'', $values) . '\'' : '';
}
else
{
throw new Exception("Field count does not match value count");
}
$sql = "INSERT INTO {$this->userTab}
(`id`, {$fields})
VALUES
('', {$values})";
// check result
if( $this->db->affected_rows <= 0 )
{
throw new Exception("Cannot create user.");
}
return true;
}
/**
* check() - Checks access rights
*
* @access public
* @param Mix $ident
* @param Int $perms
* @return Boolean
*/
public function check($ident, $perms)
{
// get id of the section
$id = $this->getId($ident, $this->modTab);
// create section perms
$perm = pow(2, $id);
return (($perm & $perms) == $perms) ? true : false;
}
/**
* getId() - Returns the id of an user
*
* @access private
* @param Mix $ident
* @param Str $table
* @return Integer
*/
private function getId($ident, $table)
{
// check if identifier is an integer
if( is_numeric($ident) )
{
$id = $ident;
}
else
{
// get user-id
$sql = "SELECT `id`
FROM
{$table}
WHERE
'name' = '{$ident}'";
// send sql-query
$result = $this->db->query($sql);
// check result
if(!$result)
{
throw new Exception("Cannot get user-id of {$ident}.");
}
// save user-values to array
$user = array();
while( $row = $result->fetch_assoc() )
{
$user[] = $row['id'];
}
// save id to integer
(int) $id = $user[0];
}
return $id;
}
}
try
{
// create connection to database
@$db = new mysqli("localhost", "user", "pwd", "usr_db");
// instance permissions class
$perm = new Permissions($db, "user", "permissions");
// show status quo
echo "Status Quo.\n";
print_r( $perm->getMods() );
// add area "user"
echo "Add section user.\n";
$perm->addMod("user");
print_r( $perm->getMods() );
// add area "nicolaus"
echo "Add section nicolaus.\n";
$perm->addMod("nicolaus");
print_r( $perm->getMods() );
// remove area "nicolaus"
echo "Remove section nicolaus.\n";
$perm->delMod("nicolaus");
print_r( $perm->getMods() );
// print out rights of user "avedo"
echo "Avedo has the following rights:\n";
print_r( $perm->getPerms() );
// print out rights of user "klaus"
echo "Klaus has the following rights:\n";
print_r( $perm->getPerms() );
}
catch(Exception $e)
{
echo "Error:<br />";
echo "<b>" . $e->getLine() . "</b>" . ": " . $e->getMessage() . "<br />";
}
?>
Zuletzt geändert von Avedo am 22.08.2008, 03:16, insgesamt 2-mal geändert.