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 :

Authentification CAS BeSimpleAuthBundle [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Février 2014
    Messages : 3
    Par défaut Authentification CAS BeSimpleAuthBundle
    Bonjour à tous,

    Voilà, j'éprouve d'énormes difficultés à l'utilisation de ce bundle:

    BeSimpleAuthBundle

    Il devrait me permettre une authentification centralisée de type CAS

    En fait quand je me connecte, je suis bien redirigé vers le serveur mais après j'ai une page blanche sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /check_path?ticket=ST-1257298-1rZxpPhpCQBu0BZz4NL4-***********.fr
    J'utilise grosso modo la même config que sur cette page d'example.

    En fait j'ai l'impression que mon problème vient du provider.
    J'utilise une classe sans mot de passe car je veux justement que ce soit
    cette authentification CAS qui les gère.

    Du coup pour adapter la classe à la BDD de l'université où je travaille,
    j'ai fais ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    class Annuaire implements UserInterface {
     
    	/*...*/
     
    	/**
    	 * @var string
     	*
     	* @ORM\Column(type="string", length=24, nullable=true, name="uidinterne")
     	*/
    	private $uidinterne;
     
    	/*...*/
     
    	private $password;
    	private $salt;
     
    	public function getRoles() {
     		// TODO: Auto-generated method stub
    	}
     
    	public function getPassword() {
     		return $this->password;
    	}
     
    	public function getSalt() {
     		return $this->salt;
    	}
     
    	public function getUsername() {
     		return $this->uidinterne;
    	}
     
    	public function eraseCredentials() {
     		// TODO: Auto-generated method stub
    	}
     
    	/*...*/
    }
    Et j'ai ça dans mon security.yml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        providers
            annuaire:
                entity:
                    class: *********\******Bundle\Entity\Annuaire
                    property: username
    Donc ça doit être ça qui ne va pas, mais je ne trouve pas comment l'adapter
    à mon cas.

    Du coup j'ai essayé de l'adapter avec le provider in_memory
    Et ça ne me fait plus cette page blanche mais j'ai ce message d'erreur:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Unable to find the controller for path "/login". Maybe you forgot to add
    the matching route in your routing configuration?

    Je ne sais pas quoi mettre comme controller pour le /login, étant donné que
    c'est le serveur CAS qui est sensé s'en charger...

    Merci d'avance.

  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,

    J'ai exactement le même problème...

    Pour tester j'ai rajouté dans le provider in_memory mon utilisateur test et ça marche...

    Le souci vient donc du provider. j'ai essayé de suivre les rares recommandations trouvées sur git en créant un user et un 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
     
    <?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;
            }
        }
    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
     
    <?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;
     
    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);
            return new User($username, null, $this->roles, true, true, true, true);
        }
     
        /**
         * {@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';
        }
     
        /**
         * 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);
        }
     
    }
    J'ai bien étendu UserFactoryInterface pour utiliser la méthode createUser.

    Le système m'envoie bien sur le cas mais au retour le provider ne semble pas trouver (créer) l'utilisateur. Du coup il m'envoie sur la page login qui bien sur n'existe pas...

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Février 2014
    Messages : 3
    Par défaut
    Salut,

    Je n'ai pas pensé à repasser par là pour dire que j'avais résolu le problème et que maintenant ça fonctionne chez moi (Je suis encore sur ce développement d'ailleurs)

    Pour le problème avec le login, j'ai créé un controller pour le login pour au moins récupérer les erreurs. Par contre il m'arrive parfois de tomber sur cette page avec le login_check, du coup je fais une redirection vers la page d'index quand il n'y a pas d'erreur (Bonjour M. Bricolage...)



    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
     
        /**
         * @Route("/connexion" ,name="page_login")
         * @Template()
         * @param \Symfony\Component\HttpFoundation\Request $request
         * @param \Symfony\Component\Security\Core\Exception\AuthenticationException $exception
         * @return array
         */
        public function loginAction(Request $request, AuthenticationException $exception = null)
        {
            if($this->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY'))
            {
                return $this->redirect($this->generateUrl('page_profil'));
            }
            if($exception === null)
            {
                return $this->redirect($this->generateUrl('page_index'));
            }
            $manager = $this->get('be_simple.sso_auth.factory')->getManager("annuaire_sso", "/");
     
            return array(
                'manager' => $manager,
                'request' => $request,
                'exception' => $exception
            );
        }
    Ensuite pour le problème du provider, il me semble que ça venait du fait que l'username n'était pas enregistré en session automatiquement.

    Donc pour faire ça il faut implémenter l'interface \Serializable et sérialiser et désérialiser la valeur qui contient ton identifiant pour le serveur CAS (en principe $username).

    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
     
        public function serialize()
        {
            return serialize(array(
                    $this->username
            ));
        }
     
     
        public function unserialize($serialized)
        {
            list (
                $this->username
            ) = unserialize($serialized);
        }
    Je remarque aussi que j'implémente Symfony\Component\Security\Core\User\EquatableInterface mais je pense que j'ai du mettre ça quand ça ne marchait pas, juste pour rajouter des trucs. Enfin à toi de vérifier si c'est nécessaire ou non. J'implémente cette interface de cette façon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public function isEqualTo(UserInterface $user)
        {
            return $this->getUsername() == $user->getUsername();
        }

    Après pour créer un nouvel utilisateur à partir d'un déjà existant dans le LDAP du serveur CAS, je ne sais pas, je ne le fais pas mais apparemment il faut que ta classe implémente UserFactoryInterface.

  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
    Salut et merci pour ta réponse.

    J'ai fait comme toi dans le loginAction mais quand je test le navigateur me dit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    La page n'est pas redirigée correctement
     
    Firefox a détecté que le serveur redirige la demande pour cette adresse d'une manière qui n'aboutira pas.
    le serializable tu le mets ou?

    j'ai voulut implémenter le User car je pensais qu'il lui fallait un mais la j'aimerais me contenter d'autoriser un user et c'est tout (avec le cas).

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Février 2014
    Messages : 3
    Par défaut
    Pardon, je n'ai pas reçu de notification de ta réponse.

    Le serializable est implémenté dans la classe User.
    Apparemment ton authentification fonctionne, j'ai juste l'impression que tu as mal fait ta redirection du login... En tout cas je n'ai jamais eu ce problème, désolé.

  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
    Salut et pas de souci

    j'ai trouvé ou mettre le serializable via un autre exemple mais je tourne toujours en rond. Je suis repartit à refaire une authentification de zéro pour le moment mais c'est laborieux... ça t'embêterait de me passer toutes les classes que tu as fait (user, provider etc...) pour lesquelles le bundle fonctionne? via un zip? Je pourrais regarder plus précisément ou ça bloque chez moi...

    d'avance merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Security] Authentification CAS et Formulaire
    Par xps1616 dans le forum Spring
    Réponses: 1
    Dernier message: 04/01/2013, 12h14
  2. [eZ Publish] Création d'une authentification CAS
    Par azrael62 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 13/09/2012, 13h43
  3. Serveur d'authentification CAS
    Par Balashov dans le forum Serveurs (Apache, IIS,...)
    Réponses: 7
    Dernier message: 15/05/2009, 17h00
  4. 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