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) {
}