Ergebnis 1 bis 13 von 13

Thema: Im Hook "processFormData" einen Besucher als Mitglied einer Gruppe anmelden

  1. #1
    Contao-Nutzer
    Registriert seit
    26.11.2012.
    Beiträge
    9

    Standard Im Hook "processFormData" einen Besucher als Mitglied einer Gruppe anmelden

    Hallo allerseits,

    Ich entwickele gerade für einen Kunden eine Funktion, die Folgendes machen soll:

    Ein Besucher kann in einem Formular seine E-Mail-Adresse und ein bestimmtes Passwort eingeben. Anhand des Passwortes wird er als ein bestehendes Mitglied als Frontend-User eingeloggt und auf eine geschützte Seite weitergeleitet. Der Kunde möchte also Besuchern einfach nur ein bestimmtes Passwort geben und sie so auf eine interne geschützte Seite von Contao weiterleiten.

    Ich setze das gerade als einen Hook um. Hier ist, was ich bisher habe:

    Code:
    <?php
    
    // src/EventListener/ProcessFormDataListener.php
    
    namespace App\EventListener;
    
    use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
    use Contao\Form;
    
    #[AsHook('processFormData')]
    class ProcessFormDataListener
    {
    
        public function __invoke(
            array  $submittedData,
            array  $formData,
            ?array $files,
            array  $labels,
            Form   $form
        ): void
        {
    
            $email = isset($submittedData['email']) ? filter_var($submittedData['email'], FILTER_SANITIZE_EMAIL) : null;
            $password = isset($submittedData['password']) ? filter_var($submittedData['password'], FILTER_SANITIZE_STRING) : null;
    
            switch ($password) {
                case '123456':
                    $this->login_user('mitglied1');
                    break;
                default:
                    exit("Password wrong");
            }
    
    
        }
    
    
        private function login_user($member)
        {
            $username = $member;
            $password = 'abcde';
    
    	// ...
    
        }
    
    }
    Ich komme jetzt aber nicht weiter, weil ich einfach keine gescheite Dokumentation finde.

    Wenn mich jemand in die richtige Richtung schubsen könnte, wäre ich sehr zu Dank verpflichtet.

  2. #2
    Contao-Fan
    Registriert seit
    24.02.2021.
    Beiträge
    634
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Du könntest hier über das MemberModel zugreifen.

    Nutze einfach ein Login-Formular und erstelle einen Benutzer mit dem Passwort. Das ist einfacher und sicherer als was du versuchst.

  3. #3
    Contao-Nutzer
    Registriert seit
    26.11.2012.
    Beiträge
    9

    Standard

    Danke für die schnelle Antwort und den Tipp! Der Kunde möchte allerdings außerdem noch jedesmal eine Email erhalten, wenn sich jemand einloggt, mit der Email-Adresse des Benutzers,,,

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

    Standard

    Security ist nicht sehr einfach. Über den processFormData Hook wirst du hier nicht (sauber) weit kommen.

    Ich würde dir der Einfachheit halber auch empfehlen einfach ein eigenes Login-Formular zu nutzen, wo der Username fix vorgegeben ist. Die Benachrichtigungs-Email kannst du mit den entsprechenden Security Events umsetzen (in Contao 4 gibt es auch noch deprecated Hooks dafür).
    » sponsor me via GitHub or PayPal or Revolut

  5. #5

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

    Standard

    Die Events gibt es auch in Contao 4. Also man sollte die schon jetzt einsetzen.
    » sponsor me via GitHub or PayPal or Revolut

  7. #7
    Contao-Nutzer
    Registriert seit
    26.11.2012.
    Beiträge
    9

    Standard

    Danke für die Antworten und hilfreichen Hinweise. Ich schau mir das mal alles an!

  8. #8
    Contao-Nutzer
    Registriert seit
    26.11.2012.
    Beiträge
    9

    Standard

    Ich hänge leider schon wieder... Wenn ihr mir nochmal helfen möchtet, wäre das fantastisch!

    Auf der Website habe ich jetzt ein Login-Form. Ich kann mich damit mit vorhandenen Benutzern einloggen. Wenn ich ein falsches Passwort eingebe, kommt natürlich eine Fehlermeldung. Hier möchte ich mich gerne einklinken.

    Der Plan ist, dass ein Benutzer seine E-Mail-Adresse und eines der vorher festgelegten Passwörter eingibt. Dann kommt natürlich eine Fehlermeldung, die möchte ich abfangen und dann den Benutzer als einen vorhandenen Benutzer einloggen und eine E-Mail an den Kunden schicken, damit er weiß, dass sich ein Benutzer mit einer bestimmten E-Mail-Adresse eingeloggt hat. Die E-Mail-Adresse ist dabei komplett variabel. Wir können also dafür nicht im Voraus einen Benutzer anlegen.

    In der Symfony-5.x-Dokumentation habe ich dafür den AuthenticationFailureHandler gefunden. Das ist, was ich im Moment habe, aber es funktioniert noch nicht. Es kommt die normale Contao-Fehlermeldung, aber ich werde nicht weitergeleitet. Kann natürlich auch sein, dass ich dafür eine Route anlegen müsste. Vielleicht habt ihr eine bessere Idee, die Funktionalität zu testen:

    Code:
    <?php
    
    // src/Security/CustomAuthenticationFailureHandler.php
    
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Security\Core\Authentication\AuthenticationException;
    use Symfony\Component\Security\Core\Exception\AuthenticationExceptionInterface;
    use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
    use Symfony\Component\Security\Core\Security;
    
    class AuthenticationFailureHandler implements AuthenticationFailureHandlerInterface
    {
        public function handle(Request $request, AuthenticationException $exception)
        {
            // Your custom logic here
            // For example, you can redirect the user to a specific page
            return new Response('Authentication failed', 403);
        }
    }
    Code:
    # config/packages/security.yaml
    
    security:
      firewalls:
        main:
            failure_handler: app.security.custom_authentication_failure_handler
    Code:
    # config/services.yaml
    
    services:
      _defaults:
          autowire: true
          autoconfigure: true
      app.authentication_failure_handler:
        class: App\Security\CustomAuthenticationFailureHandler
        arguments: ['@security']
    Ich habe leider so gut wie keine Erfahrung mit Symfony. Kann sehr gut sein, dass ich hier gerade die totalen Anfängerfehler mache.

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

    Standard

    Du willst, dass sich Nutzer trotz falschen Passwortes einloggen können?
    » sponsor me via GitHub or PayPal or Revolut

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

    Standard

    Zitat Zitat von Xe4co5MF Beitrag anzeigen
    Ich habe leider so gut wie keine Erfahrung mit Symfony.
    Wie schon erwähnt ist Security nicht so einfach. Als Anfänger wirst du mit so einer komplexen Aufgabenstellung vermutlich nicht so leicht ans Ziel kommen - und hier im Forum wird man bei so einer komplexen Aufgabenstellung u. U. auch nicht helfen können. Ggf. ist es also besser, wenn du das bei jemanden in Auftrag gibst.
    » sponsor me via GitHub or PayPal or Revolut

  11. #11
    Contao-Nutzer
    Registriert seit
    26.11.2012.
    Beiträge
    9

    Standard

    Danke für die Rückmeldung.

    Der Kunde möchte Interessenten von bestimmten Produkten seiner Website einfach nur ein Passwort geben können, so dass sie nach dem Einloggen weitergeleitet werden zu einer geschützten Produktseite. Außerdem möchte er eine E-Mail erhalten mit der E-Mail-Adresse des Nutzers.

    Schade, dass es keine klare Dokumentation für einen solchen Fall gibt. Bin bei ähnlichen Projekten noch nie in einer solchen Sackgasse gelandet.

    Trotzdem danke für die Hilfe!

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

    Standard

    Zitat Zitat von Xe4co5MF Beitrag anzeigen
    Der Kunde möchte Interessenten von bestimmten Produkten seiner Website einfach nur ein Passwort geben können, so dass sie nach dem Einloggen weitergeleitet werden zu einer geschützten Produktseite.
    Vielleicht reicht dir https://extensions.contao.org/?q=pas...-page-password ?
    » sponsor me via GitHub or PayPal or Revolut

  13. #13
    Contao-Nutzer
    Registriert seit
    26.11.2012.
    Beiträge
    9

    Standard

    Vielen Dank für den Tipp mit der Erweiterung. Das wäre auf jeden Fall eine Alternative gewesen.

    Ich habe es jetzt allerdings selber hinbekommen. Hier ist einmal der Code, Ich hoffe, euch stehen nicht die Haare zu Berge wegen 100.000 Sicherheitslücken...

    Code:
    <?php
    
    // src/EventListener/ProcessFormDataListener.php
    
    namespace App\EventListener;
    
    use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
    use Contao\Form;
    use Contao\Email;
    use Contao\CoreBundle\Security\User\UserChecker;
    use Psr\Container\ContainerInterface;
    use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
    use Symfony\Component\Security\Core\User\UserProviderInterface;
    use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
    use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
    
    
    #[AsHook('processFormData')]
    class ProcessFormDataListener
    {
    
        private $userProvider;
        private $encoderFactory;
        private $userChecker;
        private $tokenStorage;
    
        public function __construct(UserProviderInterface $userProvider, EncoderFactoryInterface $encoderFactory, UserChecker $userChecker, TokenStorageInterface $tokenStorage)
        {
            $this->userProvider = $userProvider;
            $this->encoderFactory = $encoderFactory;
            $this->userChecker = $userChecker;
            $this->tokenStorage = $tokenStorage;
        }
    
    
        private function login_user($userName, $plainPassword)
        {
            $user = $this->userProvider->loadUserByUsername($userName);
            $this->userChecker->checkPostAuth($user);
    
            $encoder = $this->encoderFactory->getEncoder($user);
    
            if ($encoder->isPasswordValid($user->getPassword(), $plainPassword, $user->getSalt())) {
    
                $token = new UsernamePasswordToken($user, $plainPassword, 'main', $user->getRoles());
    
                $this->tokenStorage->setToken($token);
    
                return true;
            }
            return false;
        }
    
    
        public function __invoke(
            array  $submittedData,
            array  $formData,
            ?array $files,
            array  $labels,
            Form   $form
        ): void
        {
    
            $email = isset($submittedData['email']) ? filter_var($submittedData['email'], FILTER_SANITIZE_EMAIL) : null;
            $password = isset($submittedData['password']) ? filter_var($submittedData['password'], FILTER_SANITIZE_STRING) : null;
    
            switch ($password) {
                case '123456789':
                    $loginSuccessful = $this->login_user('username', 'password');
                    $this->send_email($email);
                    break;
                default:
                    exit("Password wrong");
            }
    
    
        }
    
        private function send_email($login_email)
        {
    
            $email = new Email();
    
            $email->from = 'your-address@example.com';
            $email->subject = 'New Login at example.com';
            $email->text = 'On ' . date('d-m-Y') . ', at ' . date('H:i:s') . ' a login took place with the email address ' . $login_email . '.';
            $email->sendTo('123@example.com');
    
        }
    
    
    
    }
    Code:
    # config/services.yaml
    services:
      # ...
      Contao\CoreBundle\Security\User\UserChecker: '@contao.security.user_checker'
      Symfony\Component\Security\Core\User\UserProviderInterface: '@contao.security.frontend_user_provider'

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
  •