Contao-Camp 2024
Ergebnis 1 bis 11 von 11

Thema: Strukturfragen Änderungen via src Ordner

  1. #1
    Contao-Nutzer
    Registriert seit
    09.01.2011.
    Beiträge
    234

    Frage Strukturfragen Änderungen via src Ordner

    Hallo,

    ich versuche einen eigenen Authenticator einzusetzen.
    Dabei mache ich offensichtlich was falsch, hoffe nur eine Kleinigkeit.
    So schaut es aus:

    - src
    - ContaoManager
    - Plugin.php
    - Security
    - MyAuthenticator.php

    Plugin.php
    PHP-Code:
    <?php
    declare(strict_types=1);

    namespace 
    App\ContaoManager;

    use 
    Contao\CoreBundle\ContaoCoreBundle;
    use 
    Contao\ManagerPlugin\Bundle\BundlePluginInterface;
    use 
    Contao\ManagerPlugin\Bundle\Config\BundleConfig;
    use 
    Contao\ManagerPlugin\Bundle\Parser\ParserInterface;
    use 
    Contao\ManagerPlugin\Config\ContainerBuilder;
    use 
    Contao\ManagerPlugin\Config\ExtensionPluginInterface;
    use 
    App\Security\MyAuthenticator;

    class 
    Plugin implements BundlePluginInterfaceExtensionPluginInterface
    {
        public function 
    getBundles(ParserInterface $parser): array
        {
            return 
    null;
        }

        public function 
    getExtensionConfig($extensionName, array $extensionConfigsContainerBuilder $container): array
        {
            if (
    'security' !== $extensionName) {
                return 
    $extensionConfigs;
            }

            foreach (
    $extensionConfigs as &$extensionConfig) {
                if (isset(
    $extensionConfig['firewalls'], $extensionConfig['firewalls']['contao_frontend'])) {
                    
    $extensionConfig['firewalls']['contao_frontend']['anonymous'] = 'lazy';
                    
    $extensionConfig['firewalls']['contao_frontend']['guard']['authenticators'][] = MyAuthenticator::class;
                }
            }

            return 
    $extensionConfigs;
        }
    }
    MyAuthenticator.php
    PHP-Code:
    <?php
    declare(strict_types=1);

    namespace 
    App\Security;

    use 
    Contao\CoreBundle\Framework\ContaoFramework;
    use 
    Contao\Date;
    use 
    Contao\MemberModel;
    use 
    Contao\StringUtil;
    use 
    Symfony\Component\ExpressionLanguage\ExpressionLanguage;
    use 
    Symfony\Component\HttpFoundation\IpUtils;
    use 
    Symfony\Component\HttpFoundation\Request;
    use 
    Symfony\Component\HttpFoundation\Response;
    use 
    Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use 
    Symfony\Component\Security\Core\Exception\AuthenticationException;
    use 
    Symfony\Component\Security\Core\Security;
    use 
    Symfony\Component\Security\Core\User\UserInterface;
    use 
    Symfony\Component\Security\Core\User\UserProviderInterface;
    use 
    Symfony\Component\Security\Guard\AbstractGuardAuthenticator;

    class 
    MyAuthenticator extends AbstractGuardAuthenticator
    {
        
    /** @var Security */
        
    private $security;

        
    /** @var ContaoFramework */
        
    private $framework;

        
    /** @var string|null */
        
    private $requestCondition;

        public function 
    __construct(Security $securityContaoFramework $framework, ?string $requestCondition)
        {
            
    $this->security $security;
            
    $this->framework $framework;
            
    $this->requestCondition $requestCondition;
        }

        public function 
    supports(Request $request): bool
        
    {
            
    // If there already is a user logged in, don't to anything
            
    if ($this->security->getUser()) {
                return 
    false;
            }
        }

        public function 
    getCredentials(Request $request): string
        
    {
            return 
    null;
        }

        public function 
    getUser($credentialsUserProviderInterface $userProvider): ?UserInterface
        
    {
            return 
    null;
        }

        public function 
    checkCredentials($credentialsUserInterface $user): bool
        
    {
            
    // LDAP-Elemente zur Authentifizierung
            
    $ldaprdn  'CN='.$credentials->username;
            
    $ldappass $credentials->password;
    System::log('Test 8'__METHOD__TL_ACCESS);
            
    // Verbinden mit dem LDAP-Server
            
    $ldapconn ldap_connect("ldap://unternehmerverbaende.de")
                or die(
    "Keine Verbindung zum LDAP-Server möglich.");

            if (
    $ldapconn) {
                
    // Anmelden am LDAP-Server (als Member)
                
    $ldapbind ldap_bind($ldapconn$ldaprdn$ldappass);
                
    // Überprüfung der Authentifizierung
                
    if ($ldapbind) {
                    return 
    true;
                } else {
                    return 
    false;
                }
            }
        }

        public function 
    onAuthenticationSuccess(Request $requestTokenInterface $token$providerKey): ?Response
        
    {
            return 
    null;
        }

        public function 
    onAuthenticationFailure(Request $requestAuthenticationException $exception): ?Response
        
    {
            return 
    null;
        }

        public function 
    supportsRememberMe(): bool
        
    {
            return 
    false;
        }

        public function 
    start(Request $requestAuthenticationException $authException null): ?Response
        
    {
            return 
    null;
        }
    }
    wird nicht geladen, kein Logeintrag bei Loginversuch, dieser sollte doch feuern bei jeden versuch ab Erfolg oder nicht?

    root composer.json
    Code:
    ...
        "autoload": {
            "psr-4": {
                "App\\": "src/",
                "AppBundle\\": "src/AppBundle/"
            }
        }
    AppBundle ist für eine andere Erweiterung, welche unbekannte User schon bestens abfängt nach meinen Anpassungen.
    Vielen Dank
    Geändert von d.tafel (18.08.2022 um 18:40 Uhr)

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

    Standard

    Der Ordner lautet src/, nicht app/ - dir fehlen außerdem noch die richtigen Namespace Definitionen (siehe dir die Beispiele in der Entwicklerdoku an).
    » sponsor me via GitHub or PayPal or Revolut

  3. #3
    Contao-Nutzer
    Registriert seit
    09.01.2011.
    Beiträge
    234

    Standard

    Danke für die Rückmeldung.

    habe den Beitrag angepasst. Noch klappt etwas nicht.
    Die Plugin.php wird geladen, konnte einen Fehler erzeugen.

    MyAuthenticator.php bin ich nicht sicher. Ist der Namespace so ausreichend? Oder muss es in einen Unterordner?

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

    Standard

    Sofern du PSR-4 verstehst ist alles dir überlassen . Aber üblich wäre folgender Ort für deinen Authenticator:

    src/Security/MyAuthenticator.php

    Und somit wäre das dann folgender Namespace für diese Klasse:

    App\Security

    Und somit wäre das folgender FQCN für deinen Authenticator:

    App\Security\MyAuthenticator
    » sponsor me via GitHub or PayPal or Revolut

  5. #5
    Contao-Nutzer
    Registriert seit
    09.01.2011.
    Beiträge
    234

    Standard

    Habe dein Feedback umgesetzt und oben wieder hinterlegt. Es kommt leider immer noch kein Log an auch keine Fehlermeldung.

  6. #6
    Contao-Nutzer
    Registriert seit
    09.01.2011.
    Beiträge
    234

    Standard

    Warum gelingt der Login obwohl hier false zurück gegeben wird:

    PHP-Code:
        public function checkCredentials($credentialsUserInterface $user): bool
        

    System::log('Test'__METHOD__TL_ACCESS);
    return 
    false;

    Der Log wird angezeigt.
    Wenn nicht hier, wo kann ich den Login als nicht erfolgreich deklarieren. (meldung fehlgeschlagen (Benutzernamen und Passwörter unterscheiden zwischen Groß- und Kleinschreibung))

  7. #7
    Contao-Nutzer
    Registriert seit
    09.01.2011.
    Beiträge
    234

    Standard

    ok, das true false, wandert weiter runter


    PHP-Code:
        public function onAuthenticationFailure(Request $requestAuthenticationException $exception): ?Response
        
    {
            
    System::log('Test Fail'__METHOD__TL_ACCESS);
            return 
    null;
        } 
    wie schaut der Response aus, damit die typische fehlermeldung kommt beim Login Formular?

    Dieses allgemeine Beispiel geht natürlich nicht, aber vielleicht mir 1,2 Änderungen...
    PHP-Code:
    $request System::getContainer()->get('request_stack')->getCurrentRequest();
            
    $request->getSession()->set(Security::AUTHENTICATION_ERROR$exception);
            return new 
    RedirectResponse(
                
    $this->router->generate('app_login')
            ); 
    Geändert von d.tafel (19.08.2022 um 02:04 Uhr)

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

    Standard

    Da du das Login-Formular ansprichst: vielleicht ist ein Custom Authenticator gar nicht das richtige für dich? Erkläre mal was genau du erreichen möchtest.
    » sponsor me via GitHub or PayPal or Revolut

  9. #9
    Contao-Nutzer
    Registriert seit
    09.01.2011.
    Beiträge
    234

    Standard

    Das Passwort soll nicht von Contao geprüft werden, sondern live am Ldap Server.

    PHP-Code:
    if($request->request->get('FORM_SUBMIT')  == 'tl_login_125'){ 
    damit ging ich jetzt sicher das mein code nur beim Formular verwendet wird.

    mit dem HOOK importUser, konnte ich bisher unbekannte Member nach einer Ldap Authentifizierung anlegen lassen und einloggen.
    Ich fand bisher aber keine gute Lösung, folge Logins auch vom Ldap Authentifizieren zu lassen.

    Symfony bietet viel, die Beispile auf Contao zu übertragen ist noch eine Herausfoderung.
    Bin gespannt auf deine Ideen

  10. #10
    Contao-Nutzer
    Registriert seit
    09.01.2011.
    Beiträge
    234

    HTML Meine Lösung

    Ob es genau das Richtige ist, kein Plan, aber so klappt es nun:

    PHP-Code:
    <?php

    declare(strict_types=1);

    /*
     * This file is part of the ContaoIpLoginBundle.
     *
     * (c) inspiredminds
     *
     * @license LGPL-3.0-or-later
     */

    namespace InspiredMinds\ContaoIpLoginBundle\Security;

    use 
    Contao\CoreBundle\Framework\ContaoFramework;
    use 
    Contao\Date;
    use 
    Contao\MemberModel;
    use 
    Contao\StringUtil;
    use 
    Contao\System;
    use 
    Symfony\Component\ExpressionLanguage\ExpressionLanguage;
    use 
    Symfony\Component\HttpFoundation\IpUtils;
    use 
    Symfony\Component\HttpFoundation\Request;
    use 
    Symfony\Component\HttpFoundation\Response;
    use 
    Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use 
    Symfony\Component\Security\Core\Exception\AuthenticationException;
    use 
    Symfony\Component\Security\Core\Security;
    use 
    Symfony\Component\Security\Core\User\UserInterface;
    use 
    Symfony\Component\Security\Core\User\UserProviderInterface;
    use 
    Symfony\Component\Security\Guard\AbstractGuardAuthenticator;
    use 
    Symfony\Component\HttpFoundation\RedirectResponse;

    class 
    IpAuthenticator extends AbstractGuardAuthenticator
    {
        
    /** @var Security */
        
    private $security;

        
    /** @var ContaoFramework */
        
    private $framework;

        
    /** @var string|null */
        
    private $requestCondition;

        public function 
    __construct(Security $securityContaoFramework $framework, array $allowedIps, array $ignoredPaths, ?string $requestCondition)
        {
            
    $this->security $security;
            
    $this->framework $framework;
            
    $this->requestCondition $requestCondition;
        }

        public function 
    supports(Request $request): bool
        
    {
            if(
    $request->request->get('FORM_SUBMIT')  == 'tl_login_125'){
                return 
    true;
            }
            return 
    false;
        }

        public function 
    getCredentials(Request $request): string
        
    {
            if(
    $request->request->get('FORM_SUBMIT')  == 'tl_login_125'){
                return 
    $request->request->get('username');
            }
            return 
    '';
        }

        public function 
    getUser($credentialsUserProviderInterface $userProvider): ?UserInterface
        
    {
            
    $request System::getContainer()->get('request_stack')->getCurrentRequest();
            if(
    $request->request->get('FORM_SUBMIT')  == 'tl_login_125'){
                return 
    $userProvider->loadUserByUsername($request->request->get('username'));
            }
            return 
    null;
        }

        public function 
    checkCredentials($credentialsUserInterface $user): bool
        
    {
            
    $request System::getContainer()->get('request_stack')->getCurrentRequest();
            
            
    // LDAP-Elemente zur Authentifizierung
            
    $ldaprdn  'CN='.$request->request->get('username');
            
    $ldappass $request->request->get('password');
            
    // Verbinden mit dem LDAP-Server
            
    $ldapconn ldap_connect("ldap://xxx.de")
                or die(
    "Keine Verbindung zum LDAP-Server möglich.");

            if (
    $ldapconn) {
                
    // Anmelden am LDAP-Server (als Member)
                
    $ldapbind ldap_bind($ldapconn$ldaprdn$ldappass);
                
    // Überprüfung der Authentifizierung
                
    if ($ldapbind && $request->request->get('password') != ''){
                    return 
    true;
                } else {
                    return 
    false;
                }
            }
        }

        public function 
    onAuthenticationSuccess(Request $requestTokenInterface $token$providerKey): ?Response
        
    {
            return 
    null;
        }

        public function 
    onAuthenticationFailure(Request $requestAuthenticationException $exception): ?Response
        
    {
            if(
    $request->request->get('FORM_SUBMIT')  == 'tl_login_125'){
                
    $request System::getContainer()->get('request_stack')->getCurrentRequest();
                
    System::log('Test 8 Fail'.print_r($request->getPathInfo(),true), __METHOD__TL_ACCESS);
                
    $request->getSession()->set(Security::AUTHENTICATION_ERROR$exception);
                return new 
    RedirectResponse($request->headers->get('referer'));
            }
            return 
    null;
        }

        public function 
    supportsRememberMe(): bool
        
    {
            return 
    false;
        }

        public function 
    start(Request $requestAuthenticationException $authException null): ?Response
        
    {
            return 
    null;
        }
    }
    Bin offen für Verbesserung oder andere Lösungen.

  11. #11
    Contao-Nutzer
    Registriert seit
    09.01.2011.
    Beiträge
    234

    Standard

    Ich habe es aber auf brechen und biegen nicht hinbekommen das die Security im src genommen wird. Daher der Umbau einer Erweiterung mit Security Datei...

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
  •