Symfony 4.4 Easyadmin:设置权限以仅访问我拥有的实体



我有一个同事实体,它与用户实体有多对一的关系。我只希望能够访问附加到已识别用户的同事。这适用于所有CRUD权限:列出、编辑、更新、删除。

我尝试了很多方法,比如easy_adm.yaml中的DQL过滤器,但我无法获得经过身份验证的用户id。我是Symfony的大三学生,所以我不知道如何做到这一点,我必须使用Easyadmin。所以,我似乎不能使用同事控制器.php。也许是使用同事存储库.php?目前,一切都在easy_adm.yaml:中配置

easy_admin:
design:
templates:
label_null: 'null_value.html.twig'
entities:
Colleague:
class: AppEntityColleague
list:
# dql_filter: "entity.user = 15"
# dql_filter: "entity.user = '%env(AUTHENTICATED_USER)%'"
# dql_filter: "entity.user = (SELECT id FROM user WHERE email = '%env(AUTHENTICATED_USER)%')"
# dql_filter: "entity.user = (SELECT id FROM AppEntityUser WHERE email = 'aaa@gmail.com')"
fields:
- user
- name
- role
- notes
- { property: 'thumbnail', type: 'image', base_path: '%uploads_path%' }
actions: ['show', 'edit', 'delete']
form:
fields:
- user
- name
- role
- notes
- { property: 'thumbnailFile', type: 'vich_image' }
show:
fields:
- user
- name
- role
- notes
- { property: 'thumbnail', type: 'image', base_path: '%uploads_path%' }

和我的实体\同事.php:

<?php
namespace AppEntity;
use AppRepositoryColleagueRepository;
use DoctrineORMMapping as ORM;
use VichUploaderBundleMappingAnnotation as Vich;
use SymfonyComponentHttpFoundationFileFile;
/**
* @ORMEntity(repositoryClass=ColleagueRepository::class)
* @VichUploadable
*/
class Colleague
{
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMManyToOne(targetEntity=User::class, inversedBy="colleagues")
* @ORMJoinColumn(nullable=false)
*/
private $user;
/**
* @ORMColumn(type="string", length=255)
*/
private $name;
/**
* @ORMColumn(type="string", length=255, nullable=true)
*/
private $role;
/**
* @ORMColumn(type="text", nullable=true)
*/
private $notes;
/**
* @ORMColumn(type="string", length=255, nullable=true, options={"default": 0})
* 
* @var string
*/
private $thumbnail;
/**
* @VichUploadableField(mapping="colleague_thumbnails", fileNameProperty="thumbnail")
* 
* @var File
*/
private $thumbnailFile;
/**
* @ORMColumn(type="datetime")
* 
* @var DateTime
*/
private $createdAt;

/**
* @ORMColumn(type="datetime")
* 
* @var DateTime
*/
private $updatedAt;
public function __construct()
{
$this->setCreatedAt(new DateTime());
$this->setUpdatedAt(new DateTime());
// var_dump($this->get('security.token_storage')->getToken()->getUser());
// die;
}
public function getId(): ?int
{
return $this->id;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): self
{
$this->user = $user;
return $this;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getRole(): ?string
{
return $this->role;
}
public function setRole(?string $role): self
{
$this->role = $role;
return $this;
}
public function getNotes(): ?string
{
return $this->notes;
}
public function setNotes(?string $notes): self
{
$this->notes = $notes;
return $this;
}
public function getCreatedAt(): ?DateTimeInterface
{
return $this->createdAt;
}
public function setCreatedAt(DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getUpdatedAt(): ?DateTimeInterface
{
return $this->updatedAt;
}
public function setUpdatedAt(DateTimeInterface $updatedAt): self
{
$this->updatedAt = $updatedAt;
return $this;
}

public function getThumbnail(): ?string
{
return $this->thumbnail;
}
public function setThumbnail(?string $thumbnail): self
{
$this->thumbnail = $thumbnail;
return $this;
}
/**
* @return File
*/
public function getThumbnailFile()
{
return $this->thumbnailFile;
}
/**
* @param File|SymfonyComponentHttpFoundationFileUploadedFile $image
*
* @return User
*/
public function setThumbnailFile(File $thumbnail = null)
{
$this->thumbnailFile = $thumbnail;
if ($thumbnail) {
$this->updatedAt = new DateTime('now');
}
return $this;
}
}

提前感谢您的宝贵帮助。

以下是与Linkedin上提出的答案相同的答案:轻松管理高级权限。(法语帖子内容(您可以将事件订阅者与投票者结合起来,只需遵循此示例即可。顺致敬意,

我已经通过这种方式完成了Easyadmin特定的过滤:

config/packages/easy_adm.yaml:

easy_admin:
entities:
Colleague:
class: AppEntityColleague
controller: AppControllerColleagueController

src/Controller/ContageController.php:

<?php
namespace AppController;
use SymfonyComponentRoutingAnnotationRoute;
use EasyCorpBundleEasyAdminBundleControllerEasyAdminController;
use SymfonyComponentSecurityCoreExceptionAccessDeniedException;
class ColleagueController extends EasyAdminController
{
protected function createListQueryBuilder($entityClass, $sortDirection, $sortField = null, $dqlFilter = null)
{
$result = parent::createListQueryBuilder($entityClass, $sortDirection, $sortField, $dqlFilter);
if (method_exists($entityClass, 'getUser')) {
$result->andWhere('entity.user = :user');
$result->setParameter('user', $this->getUser());
}
return $result;
}
protected function createSearchQueryBuilder($entityClass, $searchQuery, array $searchableFields, $sortField = null, $sortDirection = null, $dqlFilter = null)
{
$result = parent::createSearchQueryBuilder($entityClass, $searchQuery, $searchableFields, $sortField, $sortDirection, $dqlFilter);
if (method_exists($entityClass, 'getUser')) {
$result->andWhere('entity.user = :user');
$result->setParameter('user', $this->getUser());
}
return $result;
}

protected function createEditForm($entity, array $entityProperties)
{
$result = parent::createEditForm($entity, $entityProperties);
if ($entity->getUser() !== $this->getUser()) {
throw new AccessDeniedException();
}

return $result;
}

protected function showAction()
{
$easyadmin = $this->request->attributes->get('easyadmin');
$entity = $easyadmin['item'];
if ($entity->getUser() !== $this->getUser()) {
throw new AccessDeniedException();
}
$result = parent::showAction();

return $result;
}
protected function deleteAction()
{
$easyadmin = $this->request->attributes->get('easyadmin');
$entity = $easyadmin['item'];
if ($entity->getUser() !== $this->getUser()) {
throw new AccessDeniedException();
}
$result = parent::deleteAction();

return $result;
}

/**
* Create a colleague.
*/
protected function persistEntity($entity)
{
$entity->setUser($this->getUser());
$result = parent::persistEntity($entity);

return $result;
}
}

最新更新