IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Création d'un bundle d'authentification [2.x]


Sujet :

Symfony PHP

  1. #1
    Rédacteur
    Avatar de Viduc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    2
    Par défaut Création d'un bundle d'authentification
    Bonjour,

    Dans l'optique de créer mon propre système d'authentification sur un AD (ldap), j'essaie de comprendre le mécanisme complet mis en œuvre sous symfony.

    J'essaie pour le moment de créer le mécanisme de bas d'authentification sans aller cherche dans une quelconque base ou autre, l'idée est que le système me renvoie l'autorisation.

    J'ai donc suivi de nombreux tuto/forum etc... Je me base maintenant essentiellement sur ça:

    http://symfony.com/doc/current/cookbook/security/custom_provider.html


    Mon projet est construit dans src/ADManager et j'ai un Bundle qui se nomme AuthenticationBundle
    Voici toutes mes class et fichiers divers:

    le Listener:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    namespace ADManager\AuthentificationBundle\Controller;
     
    use Symfony\Component\Security\Core\SecurityContextInterface;
    use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
    use Symfony\Component\HttpKernel\Log\LoggerInterface;
    use Symfony\Component\HttpKernel\Event\GetResponseEvent;
    use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException;
    use Symfony\Component\Security\Core\Exception\AccessDeniedException;
    use ADManager\AuthentificationBundle\Controller\UserToken;
    use AADManager\AuthentificationBundle\Controller\AuthenticationProvider;
     
    class AuthenticationListener implements ListenerInterface
        {
        private $context;
        private $authManager;
     
        public function __construct(SecurityContextInterface $context, AuthenticationManagerInterface $authManager)
            {
            $this->context = $context;
            $this->authManager = $authManager;
            }
     
        /**
         * Handles access authorization.
         *
         * @param GetResponseEvent $event A GetResponseEvent instance
         */
        public function handle(GetResponseEvent $event)
            {
            $token = $this->context->getToken();
            if (null === $token) 
                {throw new AuthenticationCredentialsNotFoundException('A Token was not found in the SecurityContext.');}
     
            //$request = $event->getRequest();
     
            if (!$token->isAuthenticated()) 
                {
                $token = $this->authManager->authenticate($token);
                return $this->context->setToken($token);
                }
            else
                {
                return $this->context->setToken($token);
                }
            }
        }
    le Provider:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    namespace ADManager\AuthentificationBundle\Controller;
     
    use Symfony\Component\Security\Core\Exception\AccountStatusException;
    use Symfony\Component\Security\Core\Exception\AuthenticationException;
    use Symfony\Component\Security\Core\Exception\ProviderNotFoundException;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface;
    use ADManager\AuthentificationBundle\Controller\UserToken;
     
    class AuthenticationProvider implements AuthenticationProviderInterface
        {
        private $userProvider;
     
        public function __construct(UserProviderInterface $userProvider)
            {
            $this->userProvider = $userProvider;
            }
     
        public function authenticate(TokenInterface $token)
            {
            if(true)
                {
                $TokenAuthentifie = new UserToken("admin", "admin", "ADM", array('ROLE_ADMIN'));
                return $TokenAuthentifie;
                }
            throw new AuthenticationException('The WSSE authentication failed.');
     
            }
     
        public function supports(TokenInterface $token) 
            {return true;}
        }
    Ma class user
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
     
    namespace ADM\AuthenticationBundle\Controller;
     
    use Symfony\Component\Security\Core\User\UserInterface;
     
    class User implements UserInterface
        {
        protected $username;
     
        protected $password;
     
        protected $roles;
     
        protected $groups;
     
        protected $salt;
     
        public function __construct($username, $password, $salt, array $roles)
            {
            $this->username = $username;
            $this->password = $password;
            $this->salt = $salt;
            $this->roles = $roles;
            //$this->groups = array();
            }
     
        public function equals(UserInterface $user) 
            {
            if (!$user instanceof WebserviceUser) {return false;}
     
            if ($this->password !== $user->getPassword()) {return false;}
     
            if ($this->getSalt() !== $user->getSalt()) {return false;}
     
            if ($this->username !== $user->getUsername()) {return false;}
     
            return true;
            }
     
        public function eraseCredentials() 
            {$this->password = null;}
     
        public function setPassword($password)
            {$this->password = $password;}
        public function getPassword() 
            {return $this->password;}
     
        public function setRoles($roles)
            {$this->roles = $roles;}
        public function getRoles() 
            {return $this->roles;}
     
        public function setSalt($salt)
            {$this->salt = $salt;}
        public function getSalt() 
            {return $this->salt;}
     
        public function setUsername($username)
            {$this->username = $username;}
        public function getUsername() 
            {return $this->username;}
        }
    mon user provider:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
     
    namespace ADM\AuthenticationBundle\Controller;
     
    use Symfony\Component\Security\Core\User\UserProviderInterface;
    use Symfony\Component\Security\Core\User\UserInterface;
    use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
    use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
    use ADM\AuthenticationBundle\Controller\User;
     
    class UserProvider implements UserProviderInterface
        {
        private $UserPWD;
     
        /**
         * Le password de l'utilisateur doit être au préalable enregistré via la fonction setUserPWD($userpwd)
         * @param type $username
         * @return \AdLdap\UserBundle\Security\User
         * @throws UsernameNotFoundException
         */
        public function loadUserByUsername($username) 
            {
            // Instanciation du LDAP
            //$ldap = $this->container->get('adldap_adldap');
            //$Liste_Roles = array();
            //if($ldap->authenticate($username, $UserPWD, false))
            //    {
            //    $Liste_Roles_Group = $this->container->getParameter('roles_groupes');
            //    foreach($Liste_Roles_Group as $roles => $group)
            //        {   
            //        if($ldap->user->inGroup($username, $group, NULL, false))
            //            {$Liste_Roles[] = $roles;}
            //        }
            //    return new User($username, $UserPWD, '', $roles);
            //    }   
            //else
            //    {throw new UsernameNotFoundException(sprintf('l\'utilisateur "%s" n\'existe pas.', $username));}
     
            return new User("admin", "admin", '', 'ROLE_ADMIN');
            }
     
        public function refreshUser(UserInterface $user) 
            {
            if (!$user instanceof User) 
                {throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));}
     
            return $this->loadUserByUsername($user->getUsername());
            }
     
        public function supportsClass($class) 
            {return $class === 'AdLdap\UserBundle\Security\User';}
     
        public function setUserPWD($userpwd)
            {$UserPWD = $userpwd;}
        }
    mon usertoken:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    namespace ADManager\AuthentificationBundle\Controller;
     
    use Symfony\Component\Security\Core\Authentication\Token\AbstractToken;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
     
    class AuthenticationToken extends AbstractToken implements TokenInterface
        {
        private $credentials;
        private $providerKey;
     
        /**
         * Constructor.
         *
         * @param string $user        The username (like a nickname, email address, etc.), or a UserInterface instance or an object implementing a __toString method.
         * @param string $credentials This usually is the password of the user
         * @param string $providerKey The provider key
         * @param array  $roles       An array of roles
         *
         * @throws \InvalidArgumentException
         */
        public function __construct($user, $credentials, $providerKey, array $roles = array())
            {
            parent::__construct($roles);
     
            if (empty($providerKey)) 
                {throw new \InvalidArgumentException('$providerKey must not be empty.');}
     
            $this->setUser($user);
            $this->credentials = $credentials;
            $this->providerKey = $providerKey;
     
            parent::setAuthenticated(count($roles) > 0);
            }
     
        /**
         * {@inheritdoc}
         */
        public function setAuthenticated($isAuthenticated)
            {
            if ($isAuthenticated) 
                {throw new \LogicException('Cannot set this token to trusted after instantiation.');}
     
            parent::setAuthenticated(false);
            }
     
        public function getCredentials()
            {return $this->credentials;}
     
        public function getProviderKey()
            {return $this->providerKey;}
     
        /**
         * {@inheritdoc}
         */
        public function eraseCredentials()
            {
            parent::eraseCredentials();
     
            $this->credentials = null;
            }
     
        public function serialize()
            {return serialize(array($this->credentials, $this->providerKey, parent::serialize()));}
     
        public function unserialize($str)
            {
            list($this->credentials, $this->providerKey, $parentStr) = unserialize($str);
            parent::unserialize($parentStr);
            }   
        }
    mon service.yml de mon bundle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    parameters:
    #    ad_manager_authentification.example.class: ADManager\AuthentificationBundle\Example
     
    services:
        ADM.security.authentication.provider:
            class: ADManager\AuthentificationBundle\Controller\AuthenticationProvider
     
        ADM.security.user.provider:
            class: ADManager\AuthentificationBundle\Controller\UserProvider
     
        ADM.security.authentication.listener:
            class: ADManager\AuthentificationBundle\Controller\AuthenticationListener
            arguments: [@security.context, @security.authentication.manager]
     
        security.authentication.factory.ADM:
            class:  ADManager\AuthentificationBundle\Factory\AuthenticationFactory
            tags:
                - { name: security.listener.factory }
    mon security_factories.yml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    services:
        security.authentication.factory.ADM:
            class:  ADManager\AuthentificationBundle\Factory\AuthenticationFactory
            tags:
                - { name: security.listener.factory }
    mon routing.yml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    _security_login:
        pattern:  /login
        defaults: { _controller: ADMAuthenticationBundle:Authentication:login }
     
    _security_check:
        pattern:  /login_check  
     
    _security_logout:
        pattern:  /logout
    le security.yml de app/config:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    security:
        encoders:
            Symfony\Component\Security\Core\User\User: plaintext
     
        factories:
            - "%kernel.root_dir%/../src/ADManager/AuthentificationBundle/Resources/config/security_factories.yml"
     
        role_hierarchy:
     
            ROLE_ADMIN:       ROLE_USER
            ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
     
        providers:
            in_memory:
                users:
                    user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                    admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
            ADM_provider:
                id: ADM.security.user.provider
     
        firewalls:
            dev:
                pattern:  ^/(_(profiler|wdt)|css|images|js)/
                security: false
     
            login:
                pattern:  ^/demo/secured/login$
                security: false
     
            ADM_provider:
                pattern: ^/DSI/.*
                provider: ADM.provider
                form_login:
                    check_path: _security_check
                    login_path: _security_login
                logout:
                    path: _security_logout
                    target: /DSI/index        #Mettre ici la route vers votre page d'accueil
                #security: true
                ADM: true
                anonymous: false
     
        access_control:
            #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
            #- { path: ^/_internal, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 }
    les routes sont bien sure déclarées tout comme le bundle.

    Je vous passe les vues..

    J'ai déjà réussi à débuguer pas mal d'erreur mais la je bloque...

    lorsque j'essaie mon url voici le message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    Whoops, looks like something went wrong.
    1/1 OutOfBoundsException: The index "0" is not in the range [0, -1].
     
        in /MOUNT/WWW/Dsi-Symfony/vendor/symfony/src/Symfony/Component/DependencyInjection/Definition.php line 248
        at Definition->replaceArgument() in /MOUNT/WWW/Dsi-Symfony/vendor/symfony/src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php line 124
        at ResolveDefinitionTemplatesPass->resolveDefinition() in /MOUNT/WWW/Dsi-Symfony/vendor/symfony/src/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php line 49
        at ResolveDefinitionTemplatesPass->process() in /MOUNT/WWW/Dsi-Symfony/vendor/symfony/src/Symfony/Component/DependencyInjection/Compiler/Compiler.php line 119
        at Compiler->compile() in /MOUNT/WWW/Dsi-Symfony/vendor/symfony/src/Symfony/Component/DependencyInjection/ContainerBuilder.php line 437
        at ContainerBuilder->compile() in /MOUNT/WWW/Dsi-Symfony/app/bootstrap.php.cache line 872
        at Kernel->buildContainer() in /MOUNT/WWW/Dsi-Symfony/app/bootstrap.php.cache line 783
        at Kernel->initializeContainer() in /MOUNT/WWW/Dsi-Symfony/app/bootstrap.php.cache line 517
        at Kernel->boot() in /MOUNT/WWW/Dsi-Symfony/app/bootstrap.php.cache line 548
        at Kernel->handle() in /MOUNT/WWW/Dsi-Symfony/web/app_dev.php line 28
    Je précise aussi que dans mon services.yml, netbeans me signal ceci à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ADM.security.authentication.listener:
            class: ADManager\AuthentificationBundle\Controller\AuthenticationListener
            arguments: [@security.context, @security.authentication.manager]
    "ScannerException while scanning for the next token we had this found character @(64) that cannot start any token"

    voilà j'espère avoir donner assez d'info, j'espère que quelqu'un pourra m'aiguiller

    merci d'avance
    Bien reçu, tous les messages. Ils disent qu’ils ont compris, qu’il n’y a plus le choix. Que l’esprit qui souffle, guidera leurs pas. Qu’arrivent les derniers temps où nous pourrons parler. Alors soyons désinvoltes, n’ayons l’air de rien

  2. #2
    Membre habitué Avatar de anta_res
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 173
    Points
    173
    Par défaut
    Je viens tout juste de m'en sortir avec le système d'authentification de Symfony et ce n'est pas une mince affaire.

    J'ai eu à faire avec une erreur du même style que la tienne et si mes souvenirs sont bon c’était un problème dans la factory.

    Fait voir le code de ta factory.

  3. #3
    Rédacteur
    Avatar de Viduc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    2
    Par défaut
    oui c'est fort possible,

    je post le fichier dès demain je ne l'ai pas sous la main ce soir...
    Bien reçu, tous les messages. Ils disent qu’ils ont compris, qu’il n’y a plus le choix. Que l’esprit qui souffle, guidera leurs pas. Qu’arrivent les derniers temps où nous pourrons parler. Alors soyons désinvoltes, n’ayons l’air de rien

  4. #4
    Rédacteur
    Avatar de Viduc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    2
    Par défaut
    voici ma class factory que j'avais oublié de mettre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    <?php
    namespace ADManager\AuthentificationBundle\Factory;
    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use Symfony\Component\DependencyInjection\Reference;
    use Symfony\Component\DependencyInjection\DefinitionDecorator;
    use Symfony\Component\Config\Definition\Builder\NodeDefinition;
    use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\SecurityFactoryInterface;
    use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\AbstractFactory ;
     
    class AuthenticationFactory extends AbstractFactory
        {
        public function create(ContainerBuilder $container, $id, $config, $userProvider, $defaultEntryPoint)
            {
            $providerId = 'security.authentication.provider.ADM.'.$id;
            $container
                ->setDefinition($providerId, new DefinitionDecorator('ADM.security.authentication.provider'))
                ->replaceArgument(0, new Reference($userProvider));
     
            $listenerId = 'security.authentication.listener.ADM.'.$id;
            $listener = $container
                            ->setDefinition($listenerId, new DefinitionDecorator('ADM.security.authentication.listener'));
                            //->replaceArgument(2, $id); // replace third argument by firewall's id
            return array($providerId, $listenerId, $defaultEntryPoint);
            }
        public function getPosition()
            {return 'pre_auth';}
        public function getKey()
            {return 'ADM';}
        public function addConfiguration(NodeDefinition $node)
            {}
        protected function createAuthProvider(ContainerBuilder $container, $id, $config, $userProviderId)
            {return 'security.authentication.provider.ADM';}
        protected function getListenerId()
            {return 'security.authentication.listener.ADM';}
        }
    en tout cas ça me rassure de voir que je ne suis pas le seul à galérer avec ça
    Bien reçu, tous les messages. Ils disent qu’ils ont compris, qu’il n’y a plus le choix. Que l’esprit qui souffle, guidera leurs pas. Qu’arrivent les derniers temps où nous pourrons parler. Alors soyons désinvoltes, n’ayons l’air de rien

  5. #5
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    418
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 418
    Points : 828
    Points
    828
    Par défaut
    Citation Envoyé par Viduc Voir le message
    en tout cas ça me rassure de voir que je ne suis pas le seul à galérer avec ça
    Je pense qu'il va falloir mettre en ligne un tuto beaucoup plus complet et détaillé que ceux existant car pour ma part, je n'avais plus sorti d'avirons de cette taille depuis fort longtemps...

    Quand je serai parvenu à mes fins, je consoliderai ma galère (cf authentication-provider-personnalise-formulaires) et la publierai.
    Objectif : mise en place de tous les éléments personnalisés d'authentification avec ou sans utilisation de formulaire mais sans appel à un quelconque service (valeurs renseignées en dur) de façon à ce que toute l'architecture soit là et directement fonctionnelle.

  6. #6
    Membre habitué Avatar de anta_res
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 173
    Points
    173
    Par défaut
    Alors le soucis c'est que dans ton service.yml tu déclare bien ADM.security.authentication.provider mais tu ne lui donne aucun paramètres.

    Or dans ta factory tu lui demande de remplacer le paramètre 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            $container
                ->setDefinition($providerId, new DefinitionDecorator('ADM.security.authentication.provider'))
                ->replaceArgument(0, new Reference($userProvider));
    Essaye de rajouter la ligne :
    Sous la déclaration de ADM.security.authentication.provider dans security.yml

  7. #7
    Rédacteur
    Avatar de Viduc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par fatbob Voir le message
    Quand je serai parvenu à mes fins, je consoliderai ma galère (cf authentication-provider-personnalise-formulaires) et la publierai.
    Je n'avais pas vu ton embarcation et je vois en effet que je ne suis pas le seul à avoir pris la mer par gros temps

    la modif fonctionne et maintenant j’obtiens ce message:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Whoops, looks like something went wrong.
    1/1 ServiceNotFoundException: The service "security.authentication.manager" has a dependency on a non-existent service "security.user.provider.concrete.adm.provider".
    Je pense qu'en fait un bon tuto simple et claire sur le fonctionnement de tout ceci serait vraiment un plus
    Bien reçu, tous les messages. Ils disent qu’ils ont compris, qu’il n’y a plus le choix. Que l’esprit qui souffle, guidera leurs pas. Qu’arrivent les derniers temps où nous pourrons parler. Alors soyons désinvoltes, n’ayons l’air de rien

  8. #8
    Membre habitué Avatar de anta_res
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 173
    Points
    173
    Par défaut
    Je ne sais pas si ça viens de ça mais dans ton security.yml dans le firewall tu utilise :

    Alors que plus haut tu déclare :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ADM_provider:
        id: ADM.security.user.provider
    Je pense qu'il faut faire un choix entre le "point" et "l'underscore"

    Et pour le tuto je suis avec vous a 100% car ça m'aurai évité à moi aussi bien des arrachages de cheveux.

  9. #9
    Rédacteur
    Avatar de Viduc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    2
    Par défaut
    Très bien vue

    J'avais fait cette modif il y a quelque temps pour tester et je n'avais pas pensé revenir en arrière...

    ça m'a permis de débuguer un peu plus mais nouveau bloquage... on dirait que j'ai un processus qui cherche à redéclarer mon user provider:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Cannot redeclare class ADM\AuthenticationBundle\Controller\UserProvider in /MOUNT/WWW/Dsi-Symfony/src/ADManager/AuthentificationBundle/Controller/UserProvider.php on line 11
    J'ai essayé de changer le nom de ma class au cas ou mais toujours pareil...
    Bien reçu, tous les messages. Ils disent qu’ils ont compris, qu’il n’y a plus le choix. Que l’esprit qui souffle, guidera leurs pas. Qu’arrivent les derniers temps où nous pourrons parler. Alors soyons désinvoltes, n’ayons l’air de rien

  10. #10
    Membre habitué Avatar de anta_res
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 173
    Points
    173
    Par défaut
    A première vue j'ai l'impression que tu t'es un peu embrouillé dans tes namespaces et tes noms de dossier.

    Un coup on a du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ADManager\AuthentificationBundle
    un autre on a du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ADM\AuthenticationBundle
    Par exemple dans ton service.yml tu a déclaré ton user provider sous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ADM.security.user.provider:
        class: ADManager\AuthentificationBundle\Controller\UserProvider
    Mais dans ton user provider le namespace est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    namespace ADM\AuthenticationBundle\Controller;
    Je pense qu'au point ou tu en es il faut que tu check ton code pour et que tu corrige toutes ces incohérences de nom. Ensuite ça devrait fonctionner.

  11. #11
    Rédacteur
    Avatar de Viduc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    2
    Par défaut
    Salut

    Alors que dire .... honte à moi!!!

    en effet c'était le gros BIP dans mes class !!! humm a force de tester dans tout les sens, de reprendre des bouts de codes et voilà, mais j'aurais du commencer par ça avant même de poster....

    Bref, après une bonne séance de nettoyage au plus profond des cales, puis du coup un gros coup de débugage j'ai bien avancé.

    Quelques questions de paramétrages restent en suspend mais désormais j'arrive sur ma page de formulaire.

    Quand je test l'authentification j’obtiens ce message:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Unable to find the controller for path "/login_check". Maybe you forgot to add the matching route in your routing configuration?
    après recherche je vois que le path du login_check ne doit pas être rensigné, c'est le système qui intercepte pour envoyer à l'authentification...

    http://symfony.com/doc/current/book/security.html

    J'ai tester plusieurs modif mais rien de concluant. Ce qui me laisse supposer que mon Listener ne serait pas à l'écoute...?

    pourtant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    17:27 root@servweb /MOUNT/WWW/Dsi-Symfony/app # php console container:debug
    [container] Public services
    Name                                              Scope     Class Name
    acme.demo.listener                                container Acme\DemoBundle\ControllerListener
    adm.security.authentication.listener              container ADManager\AuthentificationBundle\Controller\AuthenticationListener
    adm.security.authentication.provider              container ADManager\AuthentificationBundle\Controller\AuthenticationProvider
    adm.security.user.provider                        container ADManager\AuthentificationBundle\Controller\UserProvider
    avez vous eu le même problème?

    Encore merci pour cette aide précieuse
    Bien reçu, tous les messages. Ils disent qu’ils ont compris, qu’il n’y a plus le choix. Que l’esprit qui souffle, guidera leurs pas. Qu’arrivent les derniers temps où nous pourrons parler. Alors soyons désinvoltes, n’ayons l’air de rien

  12. #12
    Rédacteur
    Avatar de Viduc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    2
    Par défaut
    je met mes class et fichiers :

    app/security.yml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    security:
        encoders:
            #Symfony\Component\Security\Core\User\User: plaintext
            ADManager\AuthentificationBundle\Controller\User: plaintext
        factories:
            - "%kernel.root_dir%/../src/ADManager/AuthentificationBundle/Resources/config/security_factories.yml"
     
        role_hierarchy:
     
            ROLE_ADMIN:       ROLE_USER
            ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
     
        providers:
            in_memory:
                users:
                    user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                    admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
            ADM.provider:
                id: ADM.security.user.provider
     
        firewalls:
            dev:
                pattern:  ^/(_(profiler|wdt)|css|images|js)/
                security: false
     
            login:
                pattern: ^/DSI/login
                security: false
     
            ADM_provider:
                pattern: ^/DSI/.*
                provider: ADM.provider
                form_login:
                    #check_path: _security_check
                    #login_path: _security_login
                    check_path: /login_check
                    login_path: /login
                logout:
                    path: _security_logout
                    target: /DSI/index        #Mettre ici la route vers votre page d'accueil
                ADM: true
                anonymous: false
     
        access_control:
            #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
            #- { path: ^/_internal, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 }
    routing

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    login:
        pattern:  /login
        defaults: { _controller: ADManagerAuthentificationBundle:Authentication:login }
     
    login_check:
        pattern:  /login_check
    login.html.twig

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    {% extends "::layout.html.twig" %}
    {% block title %} {{ parent() }} - Authentification requise{% endblock %}
     
    {% block body %}
        {% if error %}
            <div class="error">{{ error.message }}</div>
        {% endif %}
     
        <form action="{{ path('login_check') }}" method="POST">       
            <input type="hidden" name="_target_path" value="{{ url('DSIMainBundle_index') }}" />
     
            <div>
                <label for="username">Username:</label>
                <input type="text" id="username" name="_username" value="{{ last_username }}" />
            </div>
     
            <div>
                <label for="password">Password:</label>
                <input type="password" id="password" name="_password" />
            </div>  
     
            <input type="submit" name="login" value="submit" />
     
        </form>
    {% endblock %}
    AuthenticationController

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    <?php
    namespace ADManager\AuthentificationBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\Security\Core\SecurityContext;
     
    class AuthenticationController extends Controller
        {
        /**
         * @extra:Route("/", name="_login")
         * @extra:Template()
         */
        public function loginAction()
            {        
            // ON récupère les erreurs d'authentification si le formulaire a été passé avec de mauvaises informations
            if ($this->get('request')->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) 
                    {$error = $this->get('request')->attributes->get(SecurityContext::AUTHENTICATION_ERROR);} 
            else {$error = $this->get('request')->getSession()->get(SecurityContext::AUTHENTICATION_ERROR);}
     
            // On envoie à notre vue le login qu'a saisi l'utilisateur précédemment
            return $this->render('ADManagerAuthentificationBundle:Authentication:login.html.twig', 
                        array(
                            'last_username' => $this->get('request')->getSession()->get(SecurityContext::LAST_USERNAME),
                            // Et les erreurs qu'il y a eut lors de la validation du formulaire
                            'error'         => $error,
                            ));
            }
        }
    Bien reçu, tous les messages. Ils disent qu’ils ont compris, qu’il n’y a plus le choix. Que l’esprit qui souffle, guidera leurs pas. Qu’arrivent les derniers temps où nous pourrons parler. Alors soyons désinvoltes, n’ayons l’air de rien

  13. #13
    Membre habitué Avatar de anta_res
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 173
    Points
    173
    Par défaut
    J'ai pas mon code sous la main pour vérifier comment j'ai fait mais il me semble qu'il faut virer la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    check_path: /login_check
    De ton security.yml

    Par contre il faut laisser la route en place.

    Mais je te reconfirme tout ça dès demain quand j'aurai accès à mon code pour vérifier

  14. #14
    Rédacteur
    Avatar de Viduc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    2
    Par défaut
    Salut,

    en faite il fallait mettre security: false

    ça permet de débugguer enfin en tout cas ça m'a donné un autre message d'erreur qui en fouillant m'a fait comprendre que ma factory n'était lancée nulle part

    il fallait en effet que mon Bundle de base s'occupe de ça j'ai donc fait ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <?php
     
    namespace ADManager\AuthentificationBundle;
     
    use Symfony\Component\HttpKernel\Bundle\Bundle;
    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use ADManager\AuthentificationBundle\Factory\AuthenticationFactory;
     
    class ADManagerAuthentificationBundle extends Bundle
        {
        public function build(ContainerBuilder $container)
            {
            parent::build($container);
     
            $extension = $container->getExtension('security');
            $extension->addSecurityListenerFactory(new AuthenticationFactory());
            }
        }
    sauf que j'ai eu un message qui me disait que la méthode addSecurityListenerFactory() n'existait pas.

    En fouillant encore sur le net j'ai trouvé que la class SecurityExtension avait semble t il quelques problèmes de version... j'ai trouvé une version fonctionnelle ici

    J'ai maintenant ce message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    InvalidConfigurationException: Unrecognized options "form_login" under "security.firewalls.ADM_provider"
    ça avance ça avance
    Bien reçu, tous les messages. Ils disent qu’ils ont compris, qu’il n’y a plus le choix. Que l’esprit qui souffle, guidera leurs pas. Qu’arrivent les derniers temps où nous pourrons parler. Alors soyons désinvoltes, n’ayons l’air de rien

  15. #15
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    418
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 418
    Points : 828
    Points
    828
    Par défaut
    J'ai eu cette erreur également.
    J'en ai eu tellement que je ne suis hélas plus bien certain de la solution qui a fonctionné mais il me semble que cela vient du listener :
    Comme l'ancien miens, le tiens implémente ListenerInterface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class AuthenticationListener implements ListenerInterface
        {
        private $context;
        private $authManager;
     
        public function __construct(SecurityContextInterface $context, AuthenticationManagerInterface $authManager)
            {
            $this->context = $context;
            $this->authManager = $authManager;
            }
    Ca, ça marche très bien si l'on n'a pas de formulaire de login.
    Pour que ça fonctionne (avec un formulaire) il faut "extend AbstractAuthenticationListener" :

    Voici le code de mon listener :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    <?php
    // Acme/SecurityBundle/Security/Firewall/AuthListener.php
     
    namespace Acme\SecurityBundle\Security\Authentication\Firewall;
     
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpKernel\Event\GetResponseEvent;
    use Symfony\Component\Security\Http\Firewall\ListenerInterface;
    use Symfony\Component\Security\Core\Exception\AuthenticationException;
    use Symfony\Component\Security\Core\SecurityContextInterface;
    use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use Symfony\Component\Security\Http\Firewall\AbstractAuthenticationListener;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Security\Http\Session\SessionAuthenticationStrategyInterface;
    use Symfony\Component\Security\Http\HttpUtils;
     
     
    use Acme\SecurityBundle\Security\Authentication\Token\UserToken;
     
    class AuthListener extends AbstractAuthenticationListener
    {
        protected $securityContext;
        protected $authenticationManager;
        protected $httpUtils;
     
        public function __construct(SecurityContextInterface $securityContext, AuthenticationManagerInterface $authenticationManager,
                                    SessionAuthenticationStrategyInterface $sessionStrategy, HttpUtils $httpUtils, $options = array())
        {
            parent::__construct($securityContext, $authenticationManager, $sessionStrategy, $httpUtils, "user", array_merge(array(
                'username_parameter' => '_username',
                'password_parameter' => '_password',
                'intention' => 'authenticate',
                'post_only' => true,
            ), $options));
        }
     
        /**
         * Performs authentication.
         *
         * @param  Request $request A Request instance
         *
         * @return TokenInterface The authenticated token, or null if full authentication is not possible
         *
         * @throws AuthenticationException if the authentication fails
         */
        protected function attemptAuthentication(Request $request)
        {
            $username = trim($request->get($this->options['username_parameter'], null, true));
            $password = $request->get($this->options['password_parameter'], null, true);
     
            //$request->getSession()->set(SecurityContextInterface::LAST_USERNAME, $username);
     
            return $this->authenticationManager->authenticate(new UserToken($username, $password, $this->providerKey));
     
        }
     
        public function getHttpUtils()
        {
            return $this->httpUtils;
        }
     
        public function setHttpUtils($httpUtils)
        {
            $this->httpUtils = $httpUtils;
        }
    }
    Et bien déclarer le service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    # Acme/SecurityBundle/Resources/config/services.yml
     
    services:
        user.security.authentication.listener:
            class:  Acme\SecurityBundle\Security\Authentication\Firewall\AuthListener
            arguments: [@security.context, @security.authentication.manager, @security.authentication.session_strategy, @security.http_utils]
            tags:
                - { name: monolog.logger, channel: security }
    Mon "bundle" semble fonctionner... Je fais donc les dernières mises au points et si tout se passe bien, je poste la solution complète.

  16. #16
    Membre habitué Avatar de anta_res
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 173
    Points
    173
    Par défaut
    Je pense que la piste de fatbob est la bonne.
    Personnellement j'utilise le listner de base de symfony car je n'ai pas de changement à faire dans le listener.
    Mais pour une procédure de connexion par login il faut bien que le listener soit "extends AbstractAuthenticationListener"

  17. #17
    Rédacteur
    Avatar de Viduc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    2
    Par défaut
    Je vois en effet l'idée ça a l'air d'être la bonne piste. J'ai essayé de faire quelques modifs vite fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    <?php
    namespace ADManager\AuthentificationBundle\Controller;
     
    use Symfony\Component\Security\Core\SecurityContextInterface;
    use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
    Use Symfony\Component\Security\Http\Firewall\ListenerInterface;
    use Symfony\Component\Security\Http\Firewall\AbstractAuthenticationListener;
    use Symfony\Component\Security\Http\Session\SessionAuthenticationStrategyInterface;
    use Symfony\Component\Security\Http\HttpUtils;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpKernel\Log\LoggerInterface;
    use Symfony\Component\HttpKernel\Event\GetResponseEvent;
    use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException;
    use Symfony\Component\Security\Core\Exception\AccessDeniedException;
    use Symfony\Component\Security\Core\Exception\AuthenticationException;
    use ADManager\AuthentificationBundle\Controller\UserToken;
    use ADManager\AuthentificationBundle\Controller\AuthenticationProvider;
     
    //class AuthenticationListener implements ListenerInterface
    class AuthenticationListener extends AbstractAuthenticationListener
        {
        protected $securityContext;
        protected $authenticationManager;
        protected $httpUtils;
     
        public function __construct(SecurityContextInterface $securityContext, AuthenticationManagerInterface $authenticationManager
                                    ,SessionAuthenticationStrategyInterface $sessionStrategy, HttpUtils $httpUtils, $options = array())
            {
            parent::__construct($securityContext, $authenticationManager, $sessionStrategy, $httpUtils, "user", 
                                array_merge(array(
                                    'username_parameter' => '_username',
                                    'password_parameter' => '_password',
                                    'intention' => 'authenticate',
                                    'post_only' => true,
                                ), $options));
            }
     
        /**
         * Handles access authorization.
         *
         * @param GetResponseEvent $event A GetResponseEvent instance
         */
        /**public function handle(GetResponseEvent $event)
            {
            $token = $this->context->getToken();
            if (null === $token) 
                {throw new AuthenticationCredentialsNotFoundException('A Token was not found in the SecurityContext.');}
    
            //$request = $event->getRequest();
    
            if (!$token->isAuthenticated()) 
                {
                $token = $this->authManager->authenticate($token);
                return $this->context->setToken($token);
                }
            else
                {
                return $this->context->setToken($token);
                }
            }*/
        /**
         * Performs authentication.
         *
         * @param  Request $request A Request instance
         *
         * @return TokenInterface The authenticated token, or null if full authentication is not possible
         *
         * @throws AuthenticationException if the authentication fails
         */
        protected function attemptAuthentication(Request $request)
            {
            $username = trim($request->get($this->options['username_parameter'], null, true));
            $password = $request->get($this->options['password_parameter'], null, true);
     
            //$request->getSession()->set(SecurityContextInterface::LAST_USERNAME, $username);
     
            return $this->authenticationManager->authenticate(new UserToken($username, $password, $this->providerKey));
     
            }
     
        public function getHttpUtils()
            {
            return $this->httpUtils;
            }
     
        public function setHttpUtils($httpUtils)
            {
            $this->httpUtils = $httpUtils;
            }        
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    parameters:
    #    ad_manager_authentification.example.class: ADManager\AuthentificationBundle\Example
     
    services:
        ADM.security.user.provider:
            class: ADManager\AuthentificationBundle\Controller\UserProvider
     
        ADM.security.authentication.provider:
            class: ADManager\AuthentificationBundle\Controller\AuthenticationProvider
            arguments: ['']      
     
        ADM.security.authentication.listener:
            class: ADManager\AuthentificationBundle\Controller\AuthenticationListener
            arguments: [@security.context, @security.authentication.manager, @security.authentication.session_strategy, @security.http_utils]
            tags:
                - { name: monolog.logger, channel: security }
     
        security.authentication.factory.ADM:
            class:  ADManager\AuthentificationBundle\Factory\AuthenticationFactory
            tags:
                - { name: security.listener.factory }
    mais j'ai toujours la même erreur. Ne sachant pas trop à quoi correspond le tag j'ai tester avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tags:
                - { name: ADM.logger, channel: security }
    mais pareil...

    Je vais continuer de tester...

    Vivement ton post avec l'ensemble du procéder
    Bien reçu, tous les messages. Ils disent qu’ils ont compris, qu’il n’y a plus le choix. Que l’esprit qui souffle, guidera leurs pas. Qu’arrivent les derniers temps où nous pourrons parler. Alors soyons désinvoltes, n’ayons l’air de rien

  18. #18
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    418
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 418
    Points : 828
    Points
    828
    Par défaut
    Ca y est, il est en ligne...
    Je l'ai mis dans un thread séparé pour qu'il soit moins perdu...

    bundle-dauthentification-solution-complete/

  19. #19
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    418
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 418
    Points : 828
    Points
    828
    Par défaut
    En repassant sur ton code, je pense que le problème peut venir de la Factory qui n'hérite pas de la bonne classe...

    Ici (authentication-provider-personnalise-formulaires/, Anta_res propose une version qui fonctionnait sans listener personnalisé.

    Dans bundle-dauthentification-solution-complete/, il y en a une autre qui fonctionne bien pour moi.

  20. #20
    Rédacteur
    Avatar de Viduc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    2
    Par défaut
    Salut et encore merci pour vos réponses. J'ai essayé les pistes mais toujours le même résultat. Je testerais demain si je peux la refont à partir de ta solution complète. En tout cas ça a l'air pas mal, ça donnera l'occasion de la tester et de te faire des retours....
    Bien reçu, tous les messages. Ils disent qu’ils ont compris, qu’il n’y a plus le choix. Que l’esprit qui souffle, guidera leurs pas. Qu’arrivent les derniers temps où nous pourrons parler. Alors soyons désinvoltes, n’ayons l’air de rien

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [2.x] Bundle d'authentification - Solution complète
    Par fatbob dans le forum Symfony
    Réponses: 37
    Dernier message: 01/06/2014, 14h12
  2. [2.x] Création d'un bundle
    Par flutz dans le forum Symfony
    Réponses: 4
    Dernier message: 14/09/2012, 19h33
  3. [2.x] [Bundle] Création d'un bundle "Panier" par la communauté
    Par creativecwx dans le forum Symfony
    Réponses: 29
    Dernier message: 24/03/2012, 21h00
  4. Création de premier bundle
    Par mdh12 dans le forum Plateformes réactives et architectures modulaires
    Réponses: 1
    Dernier message: 06/01/2012, 19h11
  5. [2.x] Création d'un Bundle : classe introuvable
    Par anis-s dans le forum Symfony
    Réponses: 6
    Dernier message: 29/11/2011, 15h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo