Ergebnis 1 bis 7 von 7

Thema: Controller mit (Security $security) funktioniert nicht

  1. #1
    Contao-Nutzer
    Registriert seit
    25.10.2023.
    Beiträge
    5

    Standard Controller mit (Security $security) funktioniert nicht

    Hallo,

    ich bin Chris und neu dabei. Ich entwickle mit html Code und Controllern eine Seite in Contao.
    Ich versuche eine Security Abfrage im Controller durchzuführen. Ich habe mir erstmal angeschaut, wie der Standard genutzt wird mit dem Beispiel:

    Code:
    // src/Controller/BackendController.php
    namespace App\Controller;
    
    use Contao\CoreBundle\Exception\AccessDeniedException;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
    use Symfony\Component\Security\Core\Security;
    use Twig\Environment;
    
    #[Route('/contao/my-backend-route', name: BackendController::class, defaults: ['_scope' => 'backend'])]
    class BackendController
    {
        private $twig;
        private $security;
    
        public function __construct(Environment $twig, Security $security)
        {
            $this->twig = $twig;
            $this->security = $security;
        }
    
        public function __invoke(): Response
        {
            if (!$this->security->isGranted('ROLE_ADMIN') && !$this->security->isGranted('contao_user.my_permissions', 'first_permission')) {
                throw new AccessDeniedException('Not enough permissions to access this controller.');
            }
    
            return new Response($this->twig->render('my_backend_route.html.twig', []));
        }
    }
    Mein Ziel ist es eine Anfrage aus dem Frontend zu bearbeiten.
    Ich verwende axios um eine Request an meine Route zu senden. Mein Controller sieht momentan so aus:

    Code:
    <?php
    // src/Controller/ExampleController.php
    namespace App\Controller;
    
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
    use Symfony\Component\Security\Core\Security;
    
    
    
    
    #[Route('/example', name: ExampleController::class)]
    class ExampleController
    {
        private $security;
    
        public function __construct(Security $security)
        {
            //
        }
    
        public function __invoke(Request $request): Response
        {
            return new Response('Der Controller funktioniert!');
        }
    }
    Ab dem Moment gab es die Fehlermeldung:
    The controller for URI &quot;/example&quot; is not callable: Controller &quot;App\Controller\ExampleController&quot; cannot be fetched from the container because it is private.

    Demnach habe ich in /config/services.yaml folgenden Part hinzugefügt:

    Code:
    services:
        App\Controller\ExampleController:
            public: true
            tags: ['controller.service_arguments']
    Nach der Korrektur kommt folgender Fehler, bei dem ich nicht mehr weiter komme.
    Too few arguments to function App\Controller\ExampleController::__construct(), 0 passed in /html/contao/var/cache/dev/ContainerQpLWJJx/getExampleControllerService.php on line 22 and exactly 1 expected (500 Internal Server Error)

    Der Security Helper in der Dokumentation scheint nützlich zu sein, aber ich weiss noch nicht wie man es anwendet:
    https://docs.contao.org/dev/referenc...ecurity-helper


    Nun zu meiner Frage. Wie kann ich eine Anfrage von einem eingeloggten User im Frontend, die an einen Controller mittels JavaScript an die URL /example geht (das Routing funktioniert), die Parameter (Security $security) im __construct verwenden? Was mache ich falsch.

    Ich freue mich auf eure Antworten.

    Beste Grüße, Chris

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.126
    Partner-ID
    10107

    Standard

    Du musst entweder den security.helper Service injecten lassen oder autowiring aktivieren (letzteres wäre für die App üblich).

    Damit die Contao Frontend Firewall aber auch bei deiner Route greift musst du auch noch den _scope auf frontend setzen (https://docs.contao.org/dev/framewor...#request-scope).
    » sponsor me via GitHub or PayPal or Revolut

  3. #3
    Contao-Nutzer
    Registriert seit
    25.10.2023.
    Beiträge
    5

    Standard

    Vielen Dank @Spooky,

    ich sehe in der Umgebung, dass die Basics fehlen. Die Bundles sind unvollständig. Ich denke da liegt das Problem.

    Code:
    use Symfony\Component\Security\Core\Security;
    Wird gar nicht erst erkannt. Ich begebe mich nochmal auf den Anfang und versuche es mit den Installationen für 4.13. Ich melde mich gerne bei Erfolg, falls andere das Problem mal trifft.

    Beste Grüße, Chris

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.126
    Partner-ID
    10107

    Standard

    Symfony\Component\Security\Core\Security kann nicht fehlen, da würde Contao gar nicht funktionieren
    » sponsor me via GitHub or PayPal or Revolut

  5. #5
    Contao-Nutzer
    Registriert seit
    25.10.2023.
    Beiträge
    5

    Standard

    Dann verstehe ich das Prinzip noch nicht.

    Der Service den ich nutze ist ja
    Code:
    use Symfony\Component\Security\Core\Security;
    und der Konstruktor soll die Parameter laden beim Nutzen des Controllers

    Code:
    public function __construct(Security $security)
    In der Zeile ist der Fehler

    request.CRITICAL: Uncaught PHP Exception ArgumentCountError: "Too few arguments to function App\Controller\ExampleController::__construct(), 0 passed in .../getExampleControllerService.php on line 22 and exactly 1 expected" at .../src/Controller/ExampleController.php line 15 {"exception":"[object] (ArgumentCountError(code: 0): Too few arguments to function App\\Controller\\ExampleController::__construct(), 0 passed in .../ContainerXtCfawF/getExampleControllerService.php on line 22 and exactly 1 expected at .../src/Controller/ExampleController.php:15)"} []


    Etwas muss ja noch fehlen. Ich habe nur keinen Anhaltspunkt, außer diesem Error, der auf die Zeile Security $security zurückweist.

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.126
    Partner-ID
    10107

    Standard

    Das was fehlt, ist das was ich bereits geschrieben habe . Du hast in deiner Service Konfiguration (services.yaml) noch nicht definiert, dass dieser Service an deinen Konstruktor übergeben werden soll. Daher die Fehlermeldung. Alternativ kannst du auch autowiring aktivieren, dann passiert das automatisch.

    Siehe dazu auch:

    » sponsor me via GitHub or PayPal or Revolut

  7. #7
    Contao-Nutzer
    Registriert seit
    25.10.2023.
    Beiträge
    5

    Daumen hoch

    Es funktioniert mit dem Autowiring. Ich habe die Begriffe zuvor ein wenig missverstanden.

    Recht herzlichen Dank. Das war schnelle und akkurate Hilfe. Die Verlinkung hat mir dazu die Suche gespart, danke dafür!

    Beste Grüße, Chris

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •