mirror of
https://github.com/Part-DB/Part-DB-server.git
synced 2025-06-30 13:34:28 +02:00
Cache ColumnSecurity annotation on ElementPermission Listener to improve performance.
This commit is contained in:
parent
977fa1df7a
commit
0d215e7e2f
1 changed files with 23 additions and 9 deletions
|
@ -52,6 +52,7 @@ class ElementPermissionListener
|
||||||
protected $disabled;
|
protected $disabled;
|
||||||
|
|
||||||
protected $perm_cache;
|
protected $perm_cache;
|
||||||
|
protected $annotation_cache;
|
||||||
|
|
||||||
public function __construct(Security $security, Reader $reader, EntityManagerInterface $em, KernelInterface $kernel)
|
public function __construct(Security $security, Reader $reader, EntityManagerInterface $em, KernelInterface $kernel)
|
||||||
{
|
{
|
||||||
|
@ -61,6 +62,7 @@ class ElementPermissionListener
|
||||||
//Disable security when the current program is running from CLI
|
//Disable security when the current program is running from CLI
|
||||||
$this->disabled = $this->isRunningFromCLI();
|
$this->disabled = $this->isRunningFromCLI();
|
||||||
$this->perm_cache = [];
|
$this->perm_cache = [];
|
||||||
|
$this->annotation_cache = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -106,7 +108,25 @@ class ElementPermissionListener
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->perm_cache[$mode][get_class($element)][$operation];
|
return $this->perm_cache[$mode][get_class($element)][$operation];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the ColumnSecurity Annotation for a given and its property.
|
||||||
|
* Adds an additional cache layer, where AnnotationReader::gerPropertyAnnotation is only called once for a class.
|
||||||
|
* @param DBElement $element The element for which the annotation should be determined.
|
||||||
|
* @param \ReflectionProperty $property The property on which the annotation should be determined.
|
||||||
|
* @return ColumnSecurity|null
|
||||||
|
*/
|
||||||
|
protected function getAnnotation(DBElement $element, \ReflectionProperty $property) : ?ColumnSecurity
|
||||||
|
{
|
||||||
|
if (!isset($this->annotation_cache[get_class($element)][$property->getName()])) {
|
||||||
|
$this->annotation_cache[get_class($element)][$property->getName()] = $this->reader->getPropertyAnnotation(
|
||||||
|
$property,
|
||||||
|
ColumnSecurity::class
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->annotation_cache[get_class($element)][$property->getName()];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -134,10 +154,7 @@ class ElementPermissionListener
|
||||||
/**
|
/**
|
||||||
* @var ColumnSecurity
|
* @var ColumnSecurity
|
||||||
*/
|
*/
|
||||||
$annotation = $this->reader->getPropertyAnnotation(
|
$annotation = $this->getAnnotation($element, $property);
|
||||||
$property,
|
|
||||||
ColumnSecurity::class
|
|
||||||
);
|
|
||||||
|
|
||||||
//Check if user is allowed to read info, otherwise apply placeholder
|
//Check if user is allowed to read info, otherwise apply placeholder
|
||||||
if ((null !== $annotation) && !$this->isGranted('read', $annotation, $element)) {
|
if ((null !== $annotation) && !$this->isGranted('read', $annotation, $element)) {
|
||||||
|
@ -176,10 +193,7 @@ class ElementPermissionListener
|
||||||
$old_data = $unitOfWork->getOriginalEntityData($element);
|
$old_data = $unitOfWork->getOriginalEntityData($element);
|
||||||
|
|
||||||
foreach ($properties as $property) {
|
foreach ($properties as $property) {
|
||||||
$annotation = $this->reader->getPropertyAnnotation(
|
$annotation = $this->getAnnotation($element, $property);
|
||||||
$property,
|
|
||||||
ColumnSecurity::class
|
|
||||||
);
|
|
||||||
|
|
||||||
$changed = false;
|
$changed = false;
|
||||||
|
|
||||||
|
@ -189,7 +203,7 @@ class ElementPermissionListener
|
||||||
|
|
||||||
//If the user is not allowed to edit or read this property, reset all values.
|
//If the user is not allowed to edit or read this property, reset all values.
|
||||||
if ((!$this->isGranted('read', $annotation, $element)
|
if ((!$this->isGranted('read', $annotation, $element)
|
||||||
|| !$this->isGranted('edit', $annotation->getReadOperationName(), $element))) {
|
|| !$this->isGranted('edit', $annotation, $element))) {
|
||||||
//Set value to old value, so that there a no change to this property
|
//Set value to old value, so that there a no change to this property
|
||||||
if (isset($old_data[$property->getName()])) {
|
if (isset($old_data[$property->getName()])) {
|
||||||
$property->setValue($element, $old_data[$property->getName()]);
|
$property->setValue($element, $old_data[$property->getName()]);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue