Symfony,如何将 DenyAccess 与 Doctrine 对象一起使用?

Symfony, How to use DenyAccess with Doctrine object?

我想在我的控制器中控制同一用户对某些方法的访问。 目前,我使用这个:

$this->denyAccessUnlessGranted('ACCESS',$this->Player($toolRepository));

但是我被迫使用这一行并将 ToolRepository 注入到每个方法中...

最简单的方法是什么? 我看到有 IsGranted 注释,但我的主题需要是一个学说对象才能通过我的投票控制访问。

/**
 * @Route("/player")
 */
class PlayerController extends AbstractController
{
    /**
     * @Route("/", name="player")
     * @throws Exception
     */
    public function Player(ToolRepository $toolRepository): \App\Entity\Tool
    {
        $playerTool = 'TestTool2';
        $tool = $toolRepository->findOneBy(array('libelle' => $playerTool));
        if (!$tool) {
            throw new Exception('Tool : ' . $playerTool . 'not found!');
        }
        return $tool;
    }

    /**
     * @Route("/main", name="player")
     * @IsGranted ("ACCESS", subject="tool")
     * @throws Exception
     */
    public function mainPlayer(PlayerRepository $playerRepository, ToolRepository $toolRepository): Response
    {
        $this->denyAccessUnlessGranted('ACCESS', $this->Player($toolRepository));

        $players = $playerRepository->findAll();
        return $this->render('player/player_mainpage.html.twig', ['players'=>$players]);
    }
}

我认为这个资源应该回答你:Symfony voters

您将把您的安全逻辑放在您的自定义投票器中,它将在您的控制器的每个函数(或您想要控制访问的每个方法)isGranted() 函数中调用。

调用您的 Player() 函数对于初学者来说是一种更简单的方法,您可以保持这样,但您不应该将其放在 Controller 中并改用服务。

编辑:

您可以将 ToolRepository 存储为 Controller private 属性 并将其注入到 __construct() 方法中,这样您就不必在每个方法中都注入 ToolRepository