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 :

pb avec BeSimple\SsoAuthBundle authentification CAS


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 : 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 pb avec BeSimple\SsoAuthBundle authentification CAS
    Bonjour

    Je rencontre un problème avec l'utilisation du bundle BeSimple\SsoAuthBundle.

    Je souhaite mettre en place une authentification par serveur CAS.

    Il n'y a pas de base de donnée contenant les utilisateurs (interne à l'application).

    J'ai installé le bundle selon la procédure décrite.

    voici mon security:
    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
     
    security:
        encoders:
            #Symfony\Component\Security\Core\User\User: plaintext
            CASManager\SecurityBundle\Security\User\user: plaintext
     
        role_hierarchy:
            ROLE_ADMIN:       ROLE_USER
            ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
     
        providers:
            in_memory:
                memory:
                    users:
                        user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                        admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
     
            user_provider:
                id: user_provider_service
     
     
        firewalls:
            dev:
                pattern:  ^/(_(profiler|wdt)|css|images|js)/
                security: false
     
            login:
                pattern:  ^/demo/secured/login$
                security: false
     
            secured_area:
                pattern:    ^/demo/secured/
                form_login:
                    check_path: _security_check
                    login_path: _demo_login
                logout:
                    path:   _demo_logout
                    target: _demo
                anonymous: ~
                http_basic:
                    realm: "Secured Demo Area"
     
            cas_firewall:
                #pattern: ^/admin/.*$
                pattern: ^/
                trusted_sso:
                    manager: admin_sso
                    #login_action: BeSimpleSsoAuthBundle:TrustedSso:login
                    login_action: false
                    #logout_action: BeSimpleSsoAuthBundle:TrustedSso:logout
                    logout_action: false
                    create_users: true
                    created_users_roles: [ROLE_USER, ROLE_ADMIN]
                    check_path: /client_check
        access_control:
            #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
    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
     
    <?php
     
    namespace CASManager\SecurityBundle\Security\User;
     
    use Symfony\Component\Security\Core\User\UserInterface;
     
    class User implements UserInterface
        {
        private $username;
        private $password;
        private $salt;
        private $roles;
     
        public function __construct($username, $password, $salt, array $roles)
        {
            $this->username = $username;
            $this->password = $password;
            $this->salt = $salt;
            $this->roles = $roles;
        }
     
        public function getRoles()
            {return $this->roles;}
     
        public function getPassword()
            {return $this->password;}
     
        public function getSalt()
            {return $this->salt;}
     
        public function getUsername()
            {return $this->username;}
     
        public function setRoles($roles)
            {$this->roles = $roles;}
     
        public function setPassword($password)
            {$this->password = $password;}
     
        public function setSalt($salt)
            {$this->salt = $salt;}
     
        public function setUsername($username)
            {$this->username = $username;}
     
        public function eraseCredentials()
            {}
     
        public function equals(UserInterface $user)
            {
            if (!$user instanceof User) 
                {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;
            }
        }
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    <?php
     
    namespace CASManager\SecurityBundle\Security\User;
     
    use Symfony\Component\Security\Core\User\UserProviderInterface;
    use Symfony\Component\Security\Core\User\UserInterface;
    use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
    use BeSimple\SsoAuthBundle\Security\Core\User\UserFactoryInterface;
    use CASManager\SecurityBundle\Security\User\User;
     
    class UserProvider implements UserProviderInterface,UserFactoryInterface
    {
        /**
         * @var array
         */
        private $roles;
     
        /**
         * Constructor.
         *
         * @param array $roles An array of roles
         */
        public function __construct(array $roles = array())
        {
            $this->roles = $roles;
        }
     
        /**
         * {@inheritdoc}
         */
        public function loadUserByUsername($username)
        {echo "ok";
            //return $this->spawnUser($username);
            $username = "toto";
            $this->roles = ["toto","tata"];
            return new User($username, null, null, $this->roles);
        }
     
        /**
         * {@inheritDoc}
         */
        public function refreshUser(UserInterface $user)
        {
            if (!$user instanceof User) {
                throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
            }
     
            return $this->spawnUser($user->getUsername());
        }
     
        /**
         * {@inheritDoc}
         */
        public function supportsClass($class)
        {
            //return $class === 'Symfony\Component\Security\Core\User\User';
            return $class === 'CASManager\SecurityBundle\Security\User\User';
        }
     
        /**
         * Spawns a new user with given username.
         *
         * @param string $username
         *
         * @return \Symfony\Component\Security\Core\User\User
         */
        private function spawnUser($username)
        {
            return new User($username, null, $this->roles, true, true, true, true);
        }
     
        public function createUser($username, array $roles, array $attributes) 
        {
            return new User($username, null, $roles, true, true, true, true);
        }
     
    }
    mon service:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    services:
        user_provider_service:
            class: CASManager\SecurityBundle\Security\User\UserProvider
            arguments: [%ROLE_ADMIN%]
    avec ça quand je test je suis bien rediriger vers le cas, puis ça tourne en boucle pour finir par me dire :
    This webpage has a redirect loop

    Nom : Capture du 2014-05-12 17:24:43.png
Affichages : 1669
Taille : 78,3 Ko


    je tourne en rond depuis un moment j'avoue ne plus savoir ou chercher si quelqu'un peut me filer un coup de main, une idée ou autre...

  2. #2
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Hello,

    J'ai eu un problème similaire en mettant en place le HWIOAuthBundle.

    Le problème se trouve dans la possibilité d'accéder aux routes de login (_demo_login) et celle de check (_security_check) de manière anonyme.

    Tu peux donc décommenter la ligne qui se trouve dans ton access_control et en rajouter une pour la route du check.

    ++

  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 : 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 et merci pour ton aide!

    en effet ce doit être une piste

    j'ai rajouté ça dans mon security:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
        access_control:
            - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
            - { path: ^/client_check, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
    désormais il ne tourne plus en boucle mais semble ne pas arriver à rediriger la page correctement:
    Nom : Capture du 2014-05-13 13:04:09.png
Affichages : 826
Taille : 77,2 Ko

    si une fois authentifié j'essaie d’atteindre la page demandé manuellement il me fait la même chose...

  4. #4
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    De quel type de connexion OAuth parle-t-on ? Une connexion avec un service public et ouvert comme Google, Facebook ou Twitter ? Ou bien un service OAuth privé mis en place par une quelconque entreprise mais qui n'a pas pour vocation de laisser n'importe qui s'identifier avec ses comptes utilisateurs ?

    Dans mon cas, le client avait son propre système OAuth, et tenait une sorte de whitelist des URL sur lesquelles leur application pouvait rediriger. Impossible de mettre la connexion OAuth en place tant que de leur côté ils n'avaient pas autorisé mon/mes URL(s) comme cible de redirection.

    Quel est le code HTTP retourné par la ligne en rouge ?
    [EDIT] peut-être une petite idée : si tu te connectes à un service OAuth comme Facebook, n'es-tu pas derrière un proxy qui bloque l'accès à Facebook (parce que Facebook en entreprise c'est mal mmh 'voyez) ?

    si une fois authentifié j'essaie d’atteindre la page demandé manuellement il me fait la même chose...
    Tu es authentifié tu es sûr ? Est-ce que tu as dans la debug toolbar dans la partie User l'affichage du token, et Authenticated à true ?
    Autre fait étrange c'est que tu aies deux appels successifs à l'URL check.

    En pas à pas à quel endroit ça bloque ?

  5. #5
    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
    en faite l'authentification se fait sur un serveur cas (sso).

    lorsque l'on essaie d'accéder à une page sous firewall, on est redirigé vers la page d'authentification de notre serveur cas, un fois authentifié par ce serveur on est rediriger vers l'appli avec un jeton (token).

    Je n'ai pas debug toolbar synfony car je ne suis pas redirigé je pense...

    la seule chose que je vois c'est ça:

    Nom : Capture du 2014-05-13 16:34:42.png
Affichages : 792
Taille : 21,7 Ko

  6. #6
    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
    Bonjour

    J'ai repris le problème depuis le début en essayant de mettre une entity comme providers (comme donné dans l'exemple du bundle). Voici mes différentes class:

    entity
    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
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
     
    <?php
     
    namespace Acme\SecurityBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Security\Core\User\UserInterface;
     
    /**
     * User
     *
     * @ORM\Table()
     * @ORM\Entity
     */
    class User implements UserInterface, \Serializable
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var string
         *
         * @ORM\Column(name="username", type="string", length=25)
         */
        private $username;
     
        /**
         * @var string
         *
         * @ORM\Column(name="salt", type="string", length=32)
         */
        private $salt;
     
        /**
         * @var string
         *
         * @ORM\Column(name="password", type="string", length=60)
         */
        private $password;
     
        /**
         * @var string
         *
         * @ORM\Column(name="email", type="string", length=60)
         */
        private $email;
     
     
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set username
         *
         * @param string $username
         * @return User
         */
        public function setUsername($username)
        {
            $this->username = $username;
     
            return $this;
        }
     
        /**
         * Get username
         *
         * @return string 
         */
        public function getUsername()
        {
            return $this->username;
        }
     
        /**
         * Set salt
         *
         * @param string $salt
         * @return User
         */
        public function setSalt($salt)
        {
            $this->salt = $salt;
     
            return $this;
        }
     
        /**
         * Get salt
         *
         * @return string 
         */
        public function getSalt()
        {
            return $this->salt;
        }
     
        /**
         * Set password
         *
         * @param string $password
         * @return User
         */
        public function setPassword($password)
        {
            $this->password = $password;
     
            return $this;
        }
     
        /**
         * Get password
         *
         * @return string 
         */
        public function getPassword()
        {
            return $this->password;
        }
     
        /**
         * Set email
         *
         * @param string $email
         * @return User
         */
        public function setEmail($email)
        {
            $this->email = $email;
     
            return $this;
        }
     
        /**
         * Get email
         *
         * @return string 
         */
        public function getEmail()
        {
            return $this->email;
        }
     
        public function eraseCredentials() {
     
        }
     
        public function getRoles() {
            $role = "ROLE_USER";
            return $role;
        }
     
        public function serialize() {
            return serialize(array(
                    $this->username
            ));
        }
     
        public function unserialize($serialized) {
            list (
                $this->username
            ) = unserialize($serialized);
        }
     
        public function isEqualTo(UserInterface $user)
        {
            return $this->getUsername() == $user->getUsername();
        }
    }
    le security:
    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
     
    security:
        encoders:
            Symfony\Component\Security\Core\User\User: plaintext
            #Acme\SecurityBundle\Security\User\User: plaintext
            Acme\SecurityBundle\Entity\User: plaintext
     
        role_hierarchy:
            ROLE_ADMIN:       ROLE_USER
            ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
     
        providers:
            in_memory:
                memory:
                    users:
                        user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                        admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
     
            #casservice:
             #   id: cas_user_provider
     
              admin_sso:
                entity:
                    class: Acme\SecurityBundle\Entity\User
                    property: username
     
        firewalls:
            dev:
                pattern:  ^/(_(profiler|wdt)|css|images|js)/
                security: false
            #login:
             #   pattern: ^/login$
             #   anonymous: ~
            #cas_secured:
            #    pattern: /
            #    cas: true
            my_firewall:
                pattern: ^/
                trusted_sso:
                    manager: admin_sso
                    login_action: false #BeSimpleSsoAuthBundle:TrustedSso:login
                    logout_action: false #BeSimpleSsoAuthBundle:TrustedSso:logout
                    create_users: true
                    created_users_roles: [ROLE_USER, ROLE_ADMIN]
                    check_path: /client_check
     
        access_control:
            #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
            - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/client_check, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    le routing
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    login:
        pattern: /login
    logout:
        pattern: /logout
    client_check:
        pattern: /client_check
    lorsque je tente d'accéder je suis bien redirigé vers le serveurs cas, je m'autentifie auprès du serveur puis il essaie de revenir, mouline quelques secondes et me donne ça:
    Nom : Capture du 2014-06-04 08:09:07.png
Affichages : 784
Taille : 19,8 Ko

    Je précise que l'utilisateur de test est créé dans la base.

    donc toujours pas de solution viable pour ce problème, si quelqu'un a d'autres pistes je suis preneur

  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 : 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
    Re,

    je viens de tester en commentant cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #validation_url: https://cas-ugr3.grenet.fr/serviceValidate
    désormais j'obtiens ceci:

    Nom : Capture du 2014-06-04 10:56:33.png
Affichages : 782
Taille : 69,2 Ko
    Nom : Capture du 2014-06-04 10:56:45.png
Affichages : 872
Taille : 58,3 Ko

  8. #8
    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
    J'avance petit à petit dans la résolution du problème...

    a priori le blocage vient du chargement de la class user dans le fichier Provider/SsoAuthenticationProvider.

    Pour le moment j'ai modifier la class comme ceci:

    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
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
     
    <?php
     
    namespace BeSimple\SsoAuthBundle\Security\Core\Authentication\Provider;
     
    use Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    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 BeSimple\SsoAuthBundle\Sso\Manager;
    use BeSimple\SsoAuthBundle\Security\Core\Authentication\Token\SsoToken;
    use BeSimple\SsoAuthBundle\Sso\ValidationInterface;
    use BeSimple\SsoAuthBundle\Security\Core\User\UserFactoryInterface;
    use Acme\SecurityBundle\Entity\User;
     
    class SsoAuthenticationProvider implements AuthenticationProviderInterface
    {
        /**
         * @var UserProviderInterface
         */
        private $userProvider;
     
        /**
         * @var UserCheckerInterface
         */
        private $userChecker;
     
        /**
         * @var bool
         */
        private $createUsers;
     
        /**
         * @var array
         */
        private $createdUsersRoles;
     
        /**
         * @var bool
         */
        private $hideUserNotFound;
     
        /**
         * Constructor.
         *
         * @param \Symfony\Component\Security\Core\User\UserProviderInterface $userProvider
         * @param \Symfony\Component\Security\Core\User\UserCheckerInterface $userChecker
         * @param bool $createUsers
         * @param array $createdUsersRoles
         * @param bool $hideUserNotFound
         *
         * @internal param bool $canCreateUser
         */
        public function __construct(UserProviderInterface $userProvider, UserCheckerInterface $userChecker, $createUsers = false, array $createdUsersRoles = array('ROLE_USER'), $hideUserNotFound = true)
        {
            $this->userProvider      = $userProvider;
            $this->userChecker       = $userChecker;
            $this->createUsers       = $createUsers;
            $this->createdUsersRoles = $createdUsersRoles;
            $this->hideUserNotFound  = $hideUserNotFound;
        }
     
        /**
         * @throws \Symfony\Component\Security\Core\Exception\AuthenticationServiceException
         *
         * @param \Symfony\Component\Security\Core\Authentication\Token\TokenInterface $token
         *
         * @return SsoToken|null
         */
        public function authenticate(TokenInterface $token)
        {
            if (!$this->supports($token)) {
                return null;
            }
     
            $validation = $token->getManager()->validateCredentials($token->getCredentials());
            if (!$validation->isSuccess()) {
                throw new BadCredentialsException('Authentication has not been validated by SSO provider.');
            }
     
            //$user = $this->provideUser($validation->getUsername(), $validation->getAttributes());
            //$this->userChecker->checkPreAuth($user);
            //$this->userChecker->checkPostAuth($user);
            $roles[] = "ROLE_USER";
            //$session = new Session();
            //$session->set('username', $this->username);
            //$authenticatedToken = new SsoToken($token->getManager(), $token->getCredentials(), $user, $user->getRoles(), $validation->getAttributes());
            $authenticatedToken = new SsoToken($token->getManager(), $token->getCredentials(), $validation->getUsername(), $roles, $validation->getAttributes());
                    foreach ($token->getAttributes() as $name => $value) {
                if ('sso:validation' == $name) {
                    continue;
                }
                $authenticatedToken->setAttribute($name, $value);
            }
     
            return $authenticatedToken;
        }
     
        /**
         * {@inheritdoc}
         */
        public function supports(TokenInterface $token)
        {
            return $token instanceof SsoToken;
        }
     
        /**
         * @throws \Symfony\Component\Security\Core\Exception\UsernameNotFoundException
         * @throws \Symfony\Component\Security\Core\Exception\BadCredentialsException
         *
         * @param string $username
         * @param array $attributes
         *
         * @return UserInterface
         */
        protected function provideUser($username, array $attributes = array())
        {
            try {
                $user = $this->retrieveUser($username);
            } catch (UsernameNotFoundException $notFound) {
                if ($this->createUsers && $this->userProvider instanceof UserFactoryInterface) {
                    $user = $this->createUser($username, $attributes);
                } elseif ($this->hideUserNotFound) {
                    throw new BadCredentialsException('Bad credentials', 0, $notFound);
                } else {
                    throw $notFound;
                }
            }
            return $user;
        }
     
        /**
         * @throws \Symfony\Component\Security\Core\Exception\AuthenticationServiceException
         *
         * @param string $username
         *
         * @return UserInterface
         */
        protected function retrieveUser($username)
        {
            try {
                $user = $this->userProvider->loadUserByUsername($username);
     
                if (!$user instanceof UserInterface) {
                    throw new AuthenticationServiceException('The user provider must return an UserInterface object.');
                }
            } catch (UsernameNotFoundException $notFound) {
                throw $notFound;
            } catch (\Exception $repositoryProblem) {
                throw new AuthenticationServiceException($repositoryProblem->getMessage(), $username, 0, $repositoryProblem);
            }
     
            return $user;
        }
     
        /**
         * @throws AuthenticationServiceException
         *
         * @param string $username
         * @param array $attributes
         *
         * @return UserInterface
         */
        protected function createUser($username, array $attributes = array())
        {
            if (!$this->userProvider instanceof UserFactoryInterface) {
                throw new AuthenticationServiceException('UserProvider must implement UserFactoryInterface to create unknown users.');
            }
     
            try {
                $user = $this->userProvider->createUser($username, $this->createdUsersRoles, $attributes);
     
                if (!$user instanceof UserInterface) {
                    throw new AuthenticationServiceException('The user provider must create an UserInterface object.');
                }
            } catch (\Exception $repositoryProblem) {
                throw new AuthenticationServiceException($repositoryProblem->getMessage(), 0, $repositoryProblem);
            }
     
            return $user;
        }
    }

    dans la doc il est dit que:

    create_users: authorize user provider to create not found users if implementing UserFactoryInterface
    le souci est ou mettre l'implémentation de UserFactoryInterface puisque je n'ai que la class User (déclarer en tant que 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
     
    security:
        encoders:
            Symfony\Component\Security\Core\User\User: plaintext
            #Acme\SecurityBundle\Security\User\User: plaintext
            Acme\SecurityBundle\Entity\User: plaintext
     
        role_hierarchy:
            ROLE_ADMIN:       ROLE_USER
            ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
     
        providers:
            in_memory:
                memory:
                    users:
                        user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                        admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
     
            casservice:
                id: cas_user_provider
     
            admin_sso:
                entity:
                    class: Acme\SecurityBundle\Entity\User
                    property: username
     
        firewalls:
            dev:
                pattern:  ^/(_(profiler|wdt)|css|images|js)/
                security: false
            #login:
            #    pattern: ^/login$
            #    anonymous: ~
            #cas_secured:
            #    pattern: /
            #    cas: true
            my_firewall:
                pattern: ^/
                trusted_sso:
                    manager: admin_sso
                    login_action: false #BeSimpleSsoAuthBundle:TrustedSso:login
                    logout_action: false #BeSimpleSsoAuthBundle:TrustedSso:logout
                    create_users: true
                    created_users_roles: [ROLE_USER, ROLE_ADMIN]
                    check_path: /client_check
     
        access_control:
            #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
            - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/client_check, roles: IS_AUTHENTICATED_ANONYMOUSLY }

  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 : 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
    Bonjour,

    je reviens tardivement sur cette discussion car j'ai avancé mais il me reste un point de blocage...

    Désormais j'arrive à m’authentifier correctement, les jetons sont créés etc... par contre je suis obligé de rajouter une ligne dans la class SsoAuthenticationProvider pour lui fournir 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
     
        /**
         * @throws \Symfony\Component\Security\Core\Exception\UsernameNotFoundException
         * @throws \Symfony\Component\Security\Core\Exception\BadCredentialsException
         *
         * @param string $username
         * @param array $attributes
         *
         * @return UserInterface
         */
        protected function provideUser($username, array $attributes = array())
        {
            try {$this->userProvider = new UserProvider();
                $user = $this->retrieveUser($username);
            } catch (UsernameNotFoundException $notFound) {
                if ($this->createUsers && $this->userProvider instanceof UserFactoryInterface) {
                    $user = $this->createUser($username, $attributes);
                } elseif ($this->hideUserNotFound) {
                    throw new BadCredentialsException('Bad credentials', 0, $notFound);
                } else {
                    throw $notFound;
                }
            }
            return $user;
        }
    J'ai déclaré mon user provider en tant que service:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    parameters:
        cas_user_provider.class: Acme\SecurityBundle\Security\User\UserProvider
     
        #cas_user_provider.class: BeSimple\SsoAuthBundle\Security\Core\User\SpawnedUserProvider;
    services:
        #Provider pour le user
        cas_user_provider:
            class: "%cas_user_provider.class%"
    puis dans mon 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
     
    security:
        encoders:
            Symfony\Component\Security\Core\User\User: plaintext
            #Acme\SecurityBundle\Security\User\User: plaintextt
     
        role_hierarchy:
            ROLE_ADMIN:       ROLE_USER
            ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
     
        providers:
            in_memory:
                memory:
                    users:
                        user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                        admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
            trusted_sso:
                id: cas_user_provider
     
        firewalls:
            dev:
                pattern:  ^/(_(profiler|wdt)|css|images|js)/
                security: false
            my_firewall:
                pattern: ^/
                trusted_sso:
                    manager: admin_sso
                    login_action: false #BeSimpleSsoAuthBundle:TrustedSso:login
                    logout_action: false #BeSimpleSsoAuthBundle:TrustedSso:logout
                    create_users: true
                    created_users_roles: [ROLE_USER, ROLE_ADMIN]
                    check_path: /client_check
     
        access_control:
            #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
            - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/client_check, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    Si je commente la ligne rajoutée dans le SsoAuthenticationProvider j'obtiens:


    J'ai suivi ces recommendations pour le user provider:
    http://symfony.com/fr/doc/current/co..._provider.html

    merci d'avance pour votre aide

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/12/2009, 23h21
  2. Serveur d'authentification CAS
    Par Balashov dans le forum Serveurs (Apache, IIS,...)
    Réponses: 7
    Dernier message: 15/05/2009, 17h00
  3. Lire mail avec JavaMail sans authentification
    Par kmdkaci dans le forum Collection et Stream
    Réponses: 17
    Dernier message: 21/01/2009, 16h15
  4. Protéger l'application avec fenetre d'authentification
    Par abbd dans le forum Windows Forms
    Réponses: 2
    Dernier message: 18/05/2008, 18h34
  5. Authentification CAS
    Par Larson dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 02/09/2005, 09h32

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