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 :

Connexion via AD


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Homme Profil pro
    Consultant technico-fonctionnel
    Inscrit en
    Juin 2012
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technico-fonctionnel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 55
    Par défaut Connexion via AD
    Bonjour, voici mon problème, je souhaite mettre en place de la sécurité sur mon site réaliser sous symfony2.1.6, via une connexion a l'active directory, mon problème est que je n'y arrive pas , j'essaye depuis maintenant un mois et ce sans succès. J'ai l'impression de tourner en rond....
    Si quelqu'un pouvait m'aider

    Merci d'avance

    choco7

  2. #2
    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 : 50
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    si tu pouvais nous faire un topo d'ou tu en es, des codes qui bloquent ou des processus que tu ne comprends pas...

  3. #3
    Membre averti
    Homme Profil pro
    Consultant technico-fonctionnel
    Inscrit en
    Juin 2012
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technico-fonctionnel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 55
    Par défaut
    Merci encore de ta réponse viduc, voici mon problème, lors de la création d'un fournisseur d'utilisateur sous symfony on on reçoit en paramètre uniquement le username ce qui ne convient pas dans le cas d'une connexion a l'AD étant donné qu'il nous faut pouvoir se connecter a l'ad pour pouvoir lire les groupes auquel appartient notre utilisateur, donc il nous faudrait le mot de passe de l'utilisateur... et la je bloque...

    J'ai créer un fournisseur d'utilisateurs (il fonctionne) mais je ne sais pas comment obtenir le mot de pass de celui ci dans le provider afin de me connecter a l'Active Directory et de lire les groupe auquel il appartient.
    merci d'avance pour votre aide,
    Choco7

  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 : 50
    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
    Billets dans le blog
    2
    Par défaut
    Alors voila en gros ce que j'ai fait pour réglé le problème (ça date donc je ne sais pas si je serais te donner les bonnes infos...)

    J'ai modifié ma class UserProvider en rajoutant une méthode setPassword (qui enregistre le password dans la class).

    Dans mon AuthProvider, avant l'appel du loadUserByUsername de l'userProvider, j'envoie le password récupérer via le token d'authentification.

    Après dans mon UserProvider je peux m'authentifié sur l'AD...

    voici ma class UserProvider:

    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
     
    <?php
    //========================================================//
    //== ADManager - Système de Gestion LDAP pour Symphony2 ==//
    //==            Viduc 2012 - viduc@sugarbox.fr          ==//
    //========================================================//
     
    namespace ADManager\SecurityBundle\Security\User;
    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 ADManager\SecurityBundle\Security\User\User;
    use ADManager\AdldapBundle\Services\AdLdap\adLDAP;
    use ADManager\AdldapBundle\Services\AdLdap\classes\adLDAPUsers;
     
    class UserProvider implements UserProviderInterface
        {
        private $password;
        private $adldap;
        private $Roles = array();
        private $RealRoles = array();
        private $userLDAP;
     
        public function __construct(adLDAP $adldap, $Roles)
            {
            //récupération du service adldap
            $this->adldap = $adldap;
            $this->Roles = $Roles;
            }
     
        public function loadUserByUsername($username)
            {
            if($this->adldap->authenticate($username,$this->password))
                {
                //instanciation de la class user depuis adLDAP
                $this->userLDAP = $this->adldap->user($this->adldap);
                //vérification pour chaque role existant si l'utilisateur fait partit du groupe AD équivalent
                foreach($this->Roles as $role => $grp)
                    {if($this->userLDAP->inGroup($username, $grp)){$this->RealRoles[] = $role;}}
                $user = new User();
                $user->setUsername($username);
                $user->setPassword($this->password);            
                $user->setRoles($this->RealRoles);
                return $user;
                }
            }
     
        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 === 'ADManager\SecurityBundle\Security\User';}
     
        //fonction pour récupérer ou enregistrer le mot de passe de l'utilisateur
        public function setPassword($password)
            {$this->password = $password;}
        public function getPassword()
            {return $this->password;}
        }
    les deux dernières méthodes ont étét rajoutées

    ma class AuthProvider:

    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
     
    <?php
    //========================================================//
    //== ADManager - Système de Gestion LDAP pour Symphony2 ==//
    //==            Viduc 2012 - viduc@sugarbox.fr          ==//
    //========================================================//
     
    namespace ADManager\SecurityBundle\Security\Authentication\Provider;
    use Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface;
    use Symfony\Component\Security\Core\User\UserProviderInterface;
    use Symfony\Component\Security\Core\Exception\AuthenticationException;
    use Symfony\Component\Security\Core\Exception\NonceExpiredException;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use Symfony\Component\Security\Core\Exception\BadCredentialsException;
    use ADManager\SecurityBundle\Security\Authentication\Token\UserToken;
     
    class AuthProvider implements AuthenticationProviderInterface
        {
        private $userProvider;
        private $cacheDir;
        private $session;
     
        public function __construct(UserProviderInterface $userProvider, $cacheDir)
            {
            $this->userProvider = $userProvider;
            $this->cacheDir     = $cacheDir;
            }
     
        public function authenticate(TokenInterface $token)
            {
            $this->userProvider->setPassword($token->getCredentials());
            $user = $this->userProvider->loadUserByUsername($token->getUsername());
            if($user)
                {
                $authenticatedToken = new UserToken($user->getUsername(), $user->getPassword(), "user", $user->getRoles());
                return $authenticatedToken;
                }
            throw new AuthenticationException("L'authentification a échouée");
            }
     
        public function supports(TokenInterface $token)
            {return $token instanceof UserToken;}
     
        public function validate()
            {return true;}
    }

  5. #5
    Membre averti
    Homme Profil pro
    Consultant technico-fonctionnel
    Inscrit en
    Juin 2012
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technico-fonctionnel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 55
    Par défaut
    bonjour, merci de ta réponse grâce a toi j'avance mais je comprend pas le adLDAP
    Je comprend pas d’où il sort ^^
    De plus si je comprend bien je dois faire un fournisseur d'authentification personnalisé?
    puis je voir ta classe user? affin de voir si la mienne est bonne
    Par contre j'ai un souci, je me base sur la documentation de symfony, mais dans celle ci pour le fournisseur d'authentification il utilise WSSE et du coup je ne sais pas comment me servir du listener, token, factory, etc... dans le cas d'une authentification AD
    la j'essaie de creer un fournisseur d'authentification mais je n'y arrive pas :/
    merci de ton aide,

    CHoco7

  6. #6
    Membre averti
    Homme Profil pro
    Consultant technico-fonctionnel
    Inscrit en
    Juin 2012
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technico-fonctionnel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 55
    Par défaut
    alors, voici mon code du fournisseur d'authentification:


    le 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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    <?php
    // Developpement/CartopiBundle/Security/Authenticaion/Token/UserToken.php
     
    namespace Developpement\CartopliBundle\Security\Authentication\Token;
     
    use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
     use Symfony\Component\Security\Core\Authentication\Token\AbstractToken;
     
    class UserToken extends AbstractToken
    {
        private $credentials;
        private $providerKey;
     
        /**
         * Constructor.
         *
         * @param string $user        The username (like a nickname, email address, etc.)
         * @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 AuthListener:

    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
    <?php
    namespace Developpement\CartopliBundle\Security\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 Developpement\CartopliBundle\Security\Authentication\Token\UserToken;
     
    // Lorsque l'on veut un formulaire de login, il faut hériter de AbstractAuthenticationListener
    // L'implémentation de ListenerInterface ne convient pas dans ce cas.
    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;
        }
    }
    ?>

    mon AuthProvider:

    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
    <?php
    namespace Developpement\CartopliBundle\Security\Authentication\Provider;
    use Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface;
    use Symfony\Component\Security\Core\User\UserProviderInterface;
    use Symfony\Component\Security\Core\Exception\AuthenticationException;
    use Symfony\Component\Security\Core\Exception\NonceExpiredException;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use Symfony\Component\Security\Core\Exception\BadCredentialsException;
    use Developpement\CartopliBundle\Security\Authentication\Token\UserToken;
     
    class AuthProvider implements AuthenticationProviderInterface
    {
        private $userProvider;
        private $cacheDir;
     
        public function __construct(UserProviderInterface $userProvider, $cacheDir)
        {
            $this->userProvider = $userProvider;
            $this->cacheDir     = $cacheDir;
        }
     
        public function authenticate(TokenInterface $token)
        {
            $user = $this->userProvider->loadUserByUsername($token->getUsername());
            // $userToken = new UserToken();
            // $userToken->setUser($user);
            // echo "it worked"; exit;
            $newToken = new UserToken($token->getUser(), $token->getCredentials(), "user", array("ROLE_ADMIN"));
            $username = $newToken->getUser();
            if (empty($username)) {
                throw new BadCredentialsException('Bad credentials :)');
            }
            //return $newToken;
     
            if ($user && $this->validate()) {
                $authenticatedToken = new UserToken($token->getUser(), $token->getCredentials(), "user", $user->getRoles());
                $authenticatedToken->setUser($user);
     
                return $authenticatedToken;
            }
        }
     
        public function supports(TokenInterface $token)
        {
            return $token instanceof UserToken;
        }
     
        public function validate()
        {
            return true;
        }
     
    }
    ?>
    mon authFactory:


    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
    <?php
    // src/Developpement/CartopliBundle/DependencyInjection/Security/Factory/UserFactory.php
     
    namespace Developpement\CartopliBundle\DependencyInjection\Security\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;
     
    class AuthFactory implements SecurityFactoryInterface
    {
        public function create(ContainerBuilder $container, $id, $config, $userProvider, $defaultEntryPoint)
        {
            $providerId = 'security.authentication.provider.user.'.$id;
            $container
                ->setDefinition($providerId, new DefinitionDecorator('user.security.authentication.provider'))
                ->replaceArgument(0, new Reference($userProvider))
            ;
            $listenerId = 'security.authentication.listener.user.'.$id;
            $listener = $container->setDefinition($listenerId, new DefinitionDecorator('user.security.authentication.listener'));
     
            return array($providerId, $listenerId, $defaultEntryPoint);
        }
     
        public function getPosition()
        {
            return 'pre_auth';
        }
     
        public function getKey()
        {
            return 'my_user_factory';  // Utilisée dans app/config/security.yml
        }
     
        public function addConfiguration(NodeDefinition $node)
        {}
    }
    ?>
    mon service.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
    parameters:
    #    developpement_cartopli.example.class: Developpement\CartopliBundle\Example
      developpement_cartopli.listener.class:  Developpement\CartopliBundle\Security\Firewall\AuthListener
    services:
    #    developpement_cartopli.example:
    #        class: %developpement_cartopli.example.class%
    #        arguments: [@service_id, "plain_value", %parameter%]
      ldap_user_provider:
              class: Developpement\CartopliBundle\Security\User\LdapUserProvider     
      user.security.authentication.provider:
            class:  Developpement\CartopliBundle\Security\Authentication\Provider\AuthProvider
            arguments: ["", %kernel.cache_dir%/security/nonces]
      user.security.authentication.listener:
            class:  Developpement\CartopliBundle\Security\Firewall\AuthListener
            arguments: [@security.context, @security.authentication.manager]
    mon fichier DeveloppementCartopliBundle.php:

    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
    <?php
    namespace Developpement\CartopliBundle;
    use Developpement\CartopliBundle\DependencyInjection\Security\Factory\AuthFactory;
    use Symfony\Component\HttpKernel\Bundle\Bundle;
    use Symfony\Component\DependencyInjection\ContainerBuilder;
     
    class DeveloppementCartopliBundle extends Bundle
    {
     
        public function build(ContainerBuilder $container)
        {
            parent::build($container);
     
            $extension = $container->getExtension('security');
            $extension->addSecurityListenerFactory(new AuthFactory());
        }
    }
    le 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
    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
    jms_security_extra:
        secure_all_services: false
        expressions: true
     
    security:
        encoders:
           # Symfony\Component\Security\Core\User\User: plaintext
            Symfony\Component\Security\Core\User\User: 
                algorithm: sha1
                iterations: 1
                encode_as_base64: false
            Developpement\CartopliBundle\Security\User\LdapUser: plaintext 
        role_hierarchy:
            ROLE_ADMIN:       ROLE_USER
            ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
            ROLE_USER1:       ROLE_USER 
            ROLE_USER2:       ROLE_USER
     
        providers:
     
            #in_memory:
               # memory:
     
                    #users:
                        #user1:  { password: fc59c73b6afd493bfdddc89a90c5ac2f92bb1093, roles: [ 'ROLE_USER1' ] }
                        #user2:  { password: 76a3bdec0c31a02eea796e145d824e3b4ec93d4a, roles: [ 'ROLE_USER2' ] }
                        #admin: { password: 74913f5cd5f61ec0bcfdb775414c2fb3d161b620 , roles: [ 'ROLE_ADMIN' ] }
            ldap:
                id: ldap_user_provider
        firewalls:
            #user_secured:
                #pattern:    ^/
                #user:      true
            dev:
                pattern:  ^/(_(profiler|wdt)|css|images|js)/
                security: false
     
            #login:
                #pattern:  ^/demo/secured/login$
                #security: false
     
            secured_area:
                pattern:    ^/
     
                anonymous: true
                #form_login:
                    #check_path: /login_check
                    #login_path: /login
                #form_login:
                    #check_path: /demo/secured/login_check
                    #login_path: /demo/secured/login
                logout:
                    path:  /logout
                    target: /login
                security: true 
                access_denied_url: /login 
                user: 
                  login_path: /login
                  check_path: /login_check
                #anonymous: ~
                #http_basic: true
                #    realm: "Secured Demo Area"
     
        access_control:
            - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/Developpement, roles: [ROLE_USER,IS_AUTHENTICATED_ANONYMOUSLY] }
            #- { path: ^/LeBtsSio/cour1, roles: ROLE_USER1}
            #- { path: ^/LeBtsSio/cour2, roles: ROLE_USER2}
            #- { path: ^/LeBtsSio, roles:[ROLE_USER2,ROLE_USER1, IS_AUTHENTICATED_ANONYMOUSLY]}
            #- { path: ^/LeBtsSio/recrutement, roles:[ROLE_USER2,ROLE_USER1]}
     
            #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
            #- { path: ^/_internal, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 }

    et voici l'erreur qui apparait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Catchable Fatal Error: Argument 6 passed to Symfony\Component\Security\Http\Firewall\AbstractAuthenticationListener::__construct() must be an instance of Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface, array given, called in C:\wamp\www\Symfony\src\Developpement\CartopliBundle\Security\Firewall\AuthListener.php on line 34 and defined in C:\wamp\www\Symfony\vendor\symfony\symfony\src\Symfony\Component\Security\Http\Firewall\AbstractAuthenticationListener.php line 79

    merci de votre aide


    Edit du jeudi 31/01/2013: mise a jour du code posté

  7. #7
    Membre émérite
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Par défaut
    Bonjour,

    Tu sollicites mon aide, j'en suis flatté.

    Toutefois, Mon SecurityListener implemente ListenerInterface. Donc difficile de t'aider sur l'implementation de AbstractAuthenticationListener.

    Au vu du message d'erreur, c'est clair. L'argument 6 fourni n'est pas le bon.

    Tu demandes de fournir AuthenticationSuccessHandlerInterface et tu fournis une array, donc il est pas content.

    Comme tu implémentes AbstractAuthenticationListener regardes dans cette classe, ce qu'il y a besoin.

    Bon Dev

  8. #8
    Membre averti
    Homme Profil pro
    Consultant technico-fonctionnel
    Inscrit en
    Juin 2012
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technico-fonctionnel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 55
    Par défaut
    Whaaa ......je n'y arrive pas!!!! je vais devenir je sais pas quoi mettre, je sais pas comment faire aider moi please
    merci d'avance car la j'ai l'impression de me taper contre un mur j'ai beau mettre quoi que ce soit, l'erreur persiste

  9. #9
    Membre averti
    Homme Profil pro
    Consultant technico-fonctionnel
    Inscrit en
    Juin 2012
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technico-fonctionnel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 55
    Par défaut
    c'est quoi la différence entre ListenerInterface et AbstractAuthenticationListener ?

  10. #10
    Membre averti
    Homme Profil pro
    Consultant technico-fonctionnel
    Inscrit en
    Juin 2012
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technico-fonctionnel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 55
    Par défaut
    Enfin, j'ai l'impression d'avoir avancer, j'ai modifier mon factory et voici ce que j'obtient comme erreur:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    No Authentication Provider found for token of class "Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken"
    quelqu'un sais quoi faire?

  11. #11
    Membre éprouvé 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
    Par défaut
    Salut,

    Je ne sais pas si je vais pouvoir t'aider car lorsque j'ai eu a faire a ce soucis je n’était pas vraiment dans le même cas de figure que toi.

    Pour résumer je voulais en plus de la vérification des données du formulaire de connexion classique (login, mot de passe), verifier un certain nombre de booleens de ma classe User (exemple : userActif, userValide).

    Ce que j'ai fait c'est que je n'ai pas eu a créer de Listener car j'utilise la connexion par formulaire fournie par symfony.
    Ce que j'ai fait c'est que j'ai étendu le FormLoginFactory et j'ai surchargé la methode createAuthProvider() pour qu'elle se serve de mon AuthenticationProvider

    Et je me souviens que je m’étais effectivement bien pris la tête à l'époque et il est vrai que la doc de symfony pourrait être un peu plus complète et détaillée sur ce sujet qui est assez complexe.

    Je te donne les code de mes différents fichiers aux cas ou tu puisse y trouver quelque choses qui t'aiderai.

    Le AuthenticationFactory
    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
     
    <?php
     
    namespace SocleCommun\SuperAdminBundle\Security\Factory;
     
    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use Symfony\Component\DependencyInjection\Reference;
    use Symfony\Component\DependencyInjection\DefinitionDecorator;
     
    use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\FormLoginFactory;
     
    class AuthenticationFactory extends FormLoginFactory{
     
        public function __construct(){
            parent::__construct();
        }
     
        public function getKey(){
            return 'auth';
        }
     
        protected function createAuthProvider(ContainerBuilder $container, $id, $config, $userProviderId){
            $provider = 'security.authentication.provider.auth.'.$id;
            $container
                ->setDefinition($provider, new DefinitionDecorator('auth.security.authentication.provider'))
                ->replaceArgument(0, new Reference($userProviderId))
                ->replaceArgument(2, $id)
            ;
     
            return $provider;
        }
     
    }
    ?>
    Le AuthenticationProvider
    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
     
    <?php
    namespace SocleCommun\SuperAdminBundle\Security\Authentication\Provider;
     
    use Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface;
     
    use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
     
    use Symfony\Component\Security\Core\User\UserProviderInterface;
    use Symfony\Component\Security\Core\User\UserCheckerInterface;
    use Symfony\Component\Security\Core\User\UserInterface;
     
    use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
    use Symfony\Component\Security\Core\Exception\AuthenticationServiceException;
    use Symfony\Component\Security\Core\Exception\BadCredentialsException;
    use Symfony\Component\Security\Core\Exception\DisabledException;
     
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
     
    use Doctrine\Bundle\DoctrineBundle\Registry;
     
    class AuthenticationProvider implements AuthenticationProviderInterface{
        private $encoderFactory;
        private $userProvider;
        private $userChecker;
        private $providerKey;
        private $doctrine;
        private $hideUserNotFoundExceptions;
     
        public function __construct(UserProviderInterface $userProvider, UserCheckerInterface $userChecker, $providerKey, EncoderFactoryInterface $encoderFactory, Registry $doctrine, $hideUserNotFoundExceptions = true){
            $this->userChecker = $userChecker;
            $this->encoderFactory = $encoderFactory;
            $this->userProvider = $userProvider;
            $this->providerKey = $providerKey;
            $this->doctrine = $doctrine;
            $this->hideUserNotFoundExceptions = $hideUserNotFoundExceptions;
        }
     
        public function authenticate(TokenInterface $token){
     
            if (!$this->supports($token)) {
                return null;
            }
     
            $username = $token->getUsername();
            if (empty($username)) {
                $username = 'NONE_PROVIDED';
            }
     
            try {
                $user = $this->retrieveUser($username, $token);
                if (!$user instanceof UserInterface) {
                    throw new AuthenticationServiceException('retrieveUser() must return a UserInterface.');
                }
     
                $infosStatut = $this->getInfosStatut($username);
     
                $this->userChecker->checkPreAuth($user);
                $this->checkAuthentication($user, $token, $infosStatut);
                $this->userChecker->checkPostAuth($user);
     
                $authenticatedToken = new UsernamePasswordToken($user, $token->getCredentials(), $this->providerKey, $user->getRoles());
     
                $authenticatedToken->setAttributes($token->getAttributes());
     
                return $authenticatedToken;
     
            } catch (UsernameNotFoundException $notFound) {
                if ($this->hideUserNotFoundExceptions) {
                    throw new BadCredentialsException('Bad credentials', 0, $notFound);
                }
     
                throw $notFound;
            }
        }
     
        /**
         * {@inheritdoc}
         */
        public function supports(TokenInterface $token){
            return $token instanceof UsernamePasswordToken && $this->providerKey === $token->getProviderKey();
        }
     
        /**
         * {@inheritdoc}
         */
        protected function checkAuthentication(UserInterface $user, UsernamePasswordToken $token, array $infosStatut){
            $currentUser = $token->getUser();
            if ($currentUser instanceof UserInterface) {
                if ($currentUser->getPassword() !== $user->getPassword()) {
                    throw new BadCredentialsException('Les paramètres utilisateurs ont été changés depuis une autre session');
                }
            }else{
                if(!$presentedPassword = $token->getCredentials()) {
                    throw new BadCredentialsException('Le mot de passe ne doit pas être vide');
                }
     
                if(!$this->encoderFactory->getEncoder($user)->isPasswordValid($user->getPassword(), $presentedPassword, $user->getSalt())) {
                    throw new BadCredentialsException('Mot de passe non valide.');
                }
     
                if(! $infosStatut['client']['actif']){
                    throw new DisabledException('Le compte de ce client est inactif');
                }
     
                if(! $infosStatut['agence']['actif']){
                    throw new DisabledException('Le compte de cette agence est inactif');
                }
     
                if(! $infosStatut['utilisateur']['actif']){
                    throw new DisabledException('Le compte de cet utilisateur est inactif');
                }
     
                if(! $infosStatut['utilisateur']['valide']){
                    throw new DisabledException('Votre compte n\'a pas été validé. Veuillez cliquer sur le lien de validation que vous avez reçu par email lors de la création de votre compte');
                }
            }
        }
     
        /**
         * {@inheritdoc}
         */
        protected function retrieveUser($username, UsernamePasswordToken $token){
            $user = $token->getUser();
            if ($user instanceof UserInterface) {
                return $user;
            }
     
            try {
                $user = $this->userProvider->loadUserByUsername($username);
     
                if (!$user instanceof UserInterface) {
                    throw new AuthenticationServiceException('The user provider must return a UserInterface object.');
                }
     
                return $user;
            } catch (UsernameNotFoundException $notFound) {
                throw $notFound;
            } catch (\Exception $repositoryProblem) {
                throw new AuthenticationServiceException($repositoryProblem->getMessage(), $token, 0, $repositoryProblem);
            }
        }
     
        //protected function getActivation($username){
        protected function getInfosStatut($username){
            $client = $this->doctrine->getRepository('SocleCommunSuperAdminBundle:configUtilisateur')
                ->findOneByIdentifiant($username);
     
            $infosStatut['utilisateur']['actif'] = $client->getActif();
            $infosStatut['utilisateur']['valide'] = $client->getValide();
            $infosStatut['agence']['actif'] = $client->getConfigAgence()->getActif();
            $infosStatut['client']['actif'] = $client->getConfigAgence()->getConfigClient()->getActif();
     
            return $infosStatut;
        }
     
    }

  12. #12
    Membre averti
    Homme Profil pro
    Consultant technico-fonctionnel
    Inscrit en
    Juin 2012
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technico-fonctionnel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 55
    Par défaut
    bonjour, merci de ton aide, je vais regarder ce que je peut faire avec tes fichiers


    merci

    choco7

  13. #13
    Membre averti
    Homme Profil pro
    Consultant technico-fonctionnel
    Inscrit en
    Juin 2012
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technico-fonctionnel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 55
    Par défaut
    sais tu comment je peut faire pour juste modifier le userToken afin de renvoyer le mot de passe de l'user??

    car c'est juste ca mon probleme, je veut pouvoir récupérer le mot de pass tapere par l'utilisateur dans le user provider.
    merci d'avance

  14. #14
    Membre éprouvé 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
    Par défaut
    Alors dans mon cas je n'ai pas de user provider personnalisé j'utilise ma classe user en tant que provider. Donc automatiquement dans le token j'ai le mot de passe.
    Par contre en fonction du cryptage que tu utilise tu risque de ne pas pouvoir utiliser le mot de passe.

    Mais si je ne m'abuse dans l'authenticationProvider on voit un truc de ce genre $token->getCredentials().
    Je pense que le mot de passe tapé par l'utilisateur lors de la connexion est stocké la dedans.

    Apres je suis sur de rien mais c'est à creuser.

  15. #15
    Membre averti
    Homme Profil pro
    Consultant technico-fonctionnel
    Inscrit en
    Juin 2012
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technico-fonctionnel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 55
    Par défaut
    peut tu m'aider a juste mettre en place un fournisseur d'authentification avec form login? sans tenir compte de la connexion ad?

  16. #16
    Membre éprouvé 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
    Par défaut
    Bin tu as déjà quasiment tout ce qu'il te faut avec les 2 fichiers que je t'ai envoyé plus haut.

    Sinon voici ce que j'ai dans mon security.yml

    pour le userProvider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    security:
        providers:
            socleCommun:
                entity:
                    class: SocleCommun\SuperAdminBundle\Entity\configUtilisateur
                    property: username
    et pour le firewall :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    main:
        pattern: ^/
        auth:
            remember_me: true
            login_path: /ptf/authentification/
        provider: socleCommun
        remember_me:
            key:         %secret%
        anonymous:       false
        logout:          true
    Base toi sur la code de symfony lui même puis rajoute petit à petit ce dont tu as besoin. C'est comme ça que j'ai fait.
    J'ai d'abord copié les fichiers du framework eux même puis quand j'ai réussi à les utiliser sans les changer alors j'ai ajouté mes changements à l’intérieur.

  17. #17
    Membre averti
    Homme Profil pro
    Consultant technico-fonctionnel
    Inscrit en
    Juin 2012
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technico-fonctionnel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 55
    Par défaut
    Ok je vais essayé, merci de ton aide

  18. #18
    Membre éprouvé 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
    Par défaut
    Tiens nous au courant de ton avancée.

    En espérant que ça t'aidera.

  19. #19
    Membre averti
    Homme Profil pro
    Consultant technico-fonctionnel
    Inscrit en
    Juin 2012
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technico-fonctionnel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 55
    Par défaut
    j'ai une erreur quand j'écri ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->replaceArgument(2, $id)
    a cause du 2 il me dit que c'est trop grand
    je vais encore faire quelque modifs et je vous en informe
    encore merci

  20. #20
    Membre éprouvé 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
    Par défaut
    oui ça c'est au niveau de la declaration de ton service il faut bien que tu ai la bon nombre d'arguments.

    J'ai oublié de te le transmettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        auth.security.authentication.provider:
            class: MonAppli\Monbundle\Security\Authentication\Provider\AuthenticationProvider
            arguments: ['',@security.user_checker,'',@security.encoder_factory,@doctrine]

Discussions similaires

  1. connexion via asp ou php ?
    Par cege dans le forum 4D
    Réponses: 5
    Dernier message: 25/01/2006, 08h43
  2. probleme de connexion via un poste distant
    Par leghola dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/09/2005, 11h51
  3. [interbase5] problem au connexion via le serveur
    Par inconu dans le forum InterBase
    Réponses: 1
    Dernier message: 31/07/2005, 00h24
  4. pb de connexion via Kylix2
    Par nadine.mauch dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 22/09/2003, 09h29
  5. [CR 9] [ASPX][C#]connexion via code
    Par nannous dans le forum Connectivité
    Réponses: 3
    Dernier message: 20/08/2003, 15h12

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