Zum Inhalt

Berechtigungen

Um Datensätze nur einer bestimmten Entity zugänglich zu machen, kann man Berechtigungen auf Record-Ebene vergeben. Dazu muss das zu speichernde Objekt "nur" das AccessControlList-Interface implementieren.

/**
 * Stringklasse mit Zugangsberechtigung
 */
class MyString extends Alvine\Types\StringType implements \Alvine\Security\Authorization\AccessControlList {

    use \Alvine\Security\Authorization\AccessControlListImplementation;

    public function __construct($value=null) {
        parent::__construct($value);
        $this->initAccessControlList();
    }

}

// Datenprovider & Storage-Objekt
$provider=new Alvine\Persistence\Provider\MongoDB\DataObject(new Alvine\Net\Resource\URI('mongodb://mongo.example.com/test/collection'));
$storage=new \Alvine\Persistence\ObjectStorage($provider);

// User
$user=new Alvine\Security\Authentication\User('me', '1425-0001');

// Sicherheitskontext in dem das Storage betrieben wird.
// Alle Abfragen laufen in diesem Kontext
$context=new Alvine\Persistence\SecurityContext($user);
$storage->setSecurityContext($context);

// Das eigentliche Datenobjekt
$string=new MyString();

// Zugriffsrecte auf dieses Objekt
$accessControl=new \Alvine\Security\Authorization\DefaultAccessControl();
$accessControl->addEntity($user);

// Wenn diese Rechte eingeschränkt werden, wird weiter unten eine Exception geworfen.
$accessControl->addPermission(new Alvine\Persistence\Permission\Read());
$accessControl->addPermission(new Alvine\Persistence\Permission\Write());
$accessControl->addPermission(new Alvine\Persistence\Permission\Delete());

// Zugriffskontrolle setzen
$string->addAccessControl($accessControl);

$id=$string->getID();
// ID ausgeben
echo $id.Alvine\Types\Character::CRLF;


$string->string='Ich esse gerne Bananen!';  // Inhalt setzen
// Objekt schreiben
try {
    $storage->writeObject($string);
} catch(Alvine\Persistence\Permission\ForbiddenException $ex) {
    echo "write not allowed";
    exit(1);
}
// ... und im Anschluß Objekt im Speicher löschen
unset($string);

// Objekt wieder laden
try {
    $obj=$storage->getObjectByID($id);
} catch(\Alvine\Persistence\Permission\ReadForbiddenException $ex) {
    echo "read not allowed";
    exit(1);
}
// ... und ausgeben
echo "\r\n".(string) $obj;

// Objekt löschen
try {
    $storage->deleteObjectByID($id);
} catch(\Alvine\Persistence\Permission\ForbiddenException $ex) {

}

Kommentare