【问题标题】:Symfony,如何将 DenyAccess 与 Doctrine 对象一起使用?
【发布时间】:2022-01-22 03:27:55
【问题描述】:

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

$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]);
    }
}

【问题讨论】:

标签: function symfony routes


【解决方案1】:

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

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

调用你的Player()函数对于初学者来说是一种更简单的方法,你可以保持这样,但你不应该把它放在控制器中并使用服务来代替。

编辑:

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

【讨论】:

  • 感谢您的回答,Symfony 的选民帮了我很多。我修改了我的问题,因为我还有另一个小问题。谢谢
  • 您可以将 ToolRepository 存储为 Controller 私有属性并将其注入到 __construct() 方法中,这样您就不必在每个方法中注入 ToolRepository。
  • 谢谢,您知道是否可以使用@IsGranted 注释来控制访问?我正在考虑通过 Player() 方法($tool)将主题 = 教义对象返回。 * IsGranted ("ACCESS", subject = "$tool") 我不知道如何从注解中获取 $tool。如果没有办法,我会使用私有财产。
  • 在这种情况下,我不确定这样做的可能性,但我认为它不可行。这意味着您需要从注释中调用 Player() 函数,我看到的唯一方法是 @IsGranted ("ACCESS", subject="PlayerController::Player()") 但该方法应该是静态的,我不知道 SF Controller 中的静态方法。不管怎样,在这两种情况下,您的访问控制都将使用一行代码。在我看来,我会坚持私有财产。
  • 那我会留在私有财产上。非常感谢您的帮助,它对我帮助很大!
猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2013-04-08
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多