Symfony всегда возвращает доступ запрещен, @Security, controller, isAuthor - PullRequest
0 голосов
/ 26 ноября 2018

Я пишу простое приложение (Symfony 4.1.7) с системой пользователя и продукта

Пользователь может редактировать свой продукт, но не другой пользователь

Моя проблема, я перехожу наизменить маршрут, вернуть доступ запрещен, даже если это мой продукт

Мой ProductController:

   /**
 * @Route("seller/myproduct/{id}/edit", name="seller_edit_product")
 * @param Product $product
 * @return Response
 * @Security("product.isAuthor(user)")
 */
public function edit(Product $product, Request $request): Response
{
    $form = $this->createForm(ProductType::class, $product);
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()){
        $this->em->flush();
        $this->addFlash('success', 'Modify Successfully');
        return $this->redirectToRoute('seller_index_product');
    }
    return $this->render('seller/product/edit.html.twig', [
        'product' => $product,
        'form' => $form->createView()
    ]);
}

Product.php

    /**
 * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="product_id")
* @ORM\JoinColumn(nullable=false)
*/
private $user;


public function getUser(): User
{
    return $this->user;
}

public function setUser(User $user): self
{
    $this->user = $user;

    return $this;
}

/**
 * @return bool
 */
public function isAuthor(User $user = null)
{
    return $user && $user->getProductId() === $this->getUser();
}

В моей функции isAuhor

== Доступ запрещен

! == Я могу получить доступ к версии продукта, которая мне не принадлежит

User.php

 /**
 * @ORM\OneToMany(targetEntity="App\Entity\Product",   mappedBy="user",orphanRemoval=true)
 */
private $product_id;

public function __construct()
{
    $this->product_id = new ArrayCollection();
}

    /**
* @return Collection|Product[]
*/
public function getProductId(): Collection
{
    return $this->product_id;
}

public function addProductId(Product $productId): self
{
    if (!$this->product_id->contains($productId)) {
            $this->product_id[] = $productId;
            $productId->setUser($this);
    }

 return $this;  
}

}

Спасибо

1 Ответ

0 голосов
/ 26 ноября 2018

Ваша функция isAuthor всегда будет возвращать false, когда вы сравниваете ArrayCollection с User

. Вы можете добавить функцию в определение класса пользователя, которая проверяет, есть ли у данного пользователяданный продукт или нет.

Итак, в Product.php:

/**
 * @return bool
 */
public function isAuthor(User $user = null)
{
    return $user && $user->hasProduct($this); 
}

И функция hasProduction может выглядеть примерно так:

 // this goes into User.php
/**
 * @return bool
 */
public function hasProduct(Product $product)
{
    return $this->product_id->contains($product) 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...