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
我想在我的控制器中控制同一用户对某些方法的访问。 目前,我使用这个:
$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