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

Bibliothèques et frameworks PHP Discussion :

Authentification avec système CAS [CakePHP]


Sujet :

Bibliothèques et frameworks PHP

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

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

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    2
    Par défaut Authentification avec système CAS
    Bonjour

    J'essaie de configurer mon authentification avec un serveur CAS. J'ai réussi toute la première partie à savoir rediriger vers le serveurs et s'authentifier. Mais lorsque l'utilisateur est renvoyé vers la page demandé, le système d'authentification de cake considère que l'utilisateur non connecté ..?

    voici mes différents codes:

    dans mon appController:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public $components = array(
            'Session',
            'Auth' => array(
                'loginRedirect' => array('controller' => 'gepadbals', 'action' => 'index'),
                'logoutRedirect' => array('controller' => 'users', 'action' => 'login'),
                'authenticate' => array('Cas'),
                'loginAction' => array('controller'=>'users','action' => 'login'))
            );
     
    public function beforeFilter() 
                {$this->Auth->allow(array('controller'=>'users','action' => 'login'));
     
                }
    ma class CasAuthenticate:

    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
     
    <?php
     
    App::uses('BaseAuthenticate', 'Controller/Component/Auth');
    require_once '/usr/share/php/CAS.php';
     
    class CasAuthenticate extends BaseAuthenticate
        {
        function initialize(&$controller){$this->controller =$controller;}
     
        public function authenticate(CakeRequest $request, CakeResponse $response) 
            {
            $cas = new phpCAS();
     
            $etablissement = $request->pass;
            $casHost = null; $domain = null;
            if(isset($etablissement[0]))
                {
                switch ($etablissement[0])
                    {
                    case 1:
                        $casHost = "cas-ujf.grenet.fr";
                        $domain = "ujf-grenoble.fr";
                        break;
                    case 2:
                        $casHost = "cas-upmf.grenet.fr";
                        $domain = "upmf-grenoble.fr";
                        break;
                    case 3:
                        $casHost = "cas-ugr3.grenet.fr";
                        $domain = "u-grenoble3.fr";
                        break;
                    }
                    //echo $casHost;
                //redirection vers le serveur CAS pour authentification
                $cas->client(CAS_VERSION_2_0,$casHost,443,'');
                $cas->setNoCasServerValidation();
                $cas->forceAuthentication();
     
                //enregistrement des informations de session
                $_SESSION["username"] = $cas->getUser();
                $_SESSION["domain"] = $domain;
                $retour["username"] = $cas->getUser();
                $retour["password"] = "";
     
                //Redirection vers index
                if($cas->checkAuthentication()){return $retour;}
                else {return false;}
                }
            }
        /**
         * Fonction de connexion
         * @return type
         */
        public function login() 
            {return true;}   
    }
    ma class UsersController:
    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
     
    <?php
     
     
    class UsersController extends AppController 
        {
     
        /**
         * Fonction de connexion
         * @return type
         */
        public function login() 
            {
            //$this->set('options', array('ujf-grenoble.fr' => 'U1', 'upmf-grenoble.fr' => 'U2', 'u-grenoble3.fr' => 'U3'));
            //if ($this->request->is('post')) 
            //    {
                if ($this->Auth->login()) 
                    {
                    $this->User->username = $_SESSION["username"];
                    $this->User->password = "test";
                    $login = $this->User->username;
     
                    return $this->redirect($this->Auth->redirect());
                    } 
                else {$this->Session->setFlash(__("Nom d'user ou mot de passe invalide, réessayer"));}
            //    }
            }
     
        /**
         * Fonction de déconnexion
         * @return type
         */
        public function logout() 
            {return $this->redirect($this->Auth->logout());}
        }
    mon model 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
     
    <?php
    App::uses('SimplePasswordHasher', 'Controller/Component/Auth');
    class User extends AppModel 
        {
        public $name = 'User';
        public $useTable = false;
     
        // Définition du schéma modèle
        var $_schema = array
            (
            'username' => array
                (
                'type' => 'string',
                'length' => 30
                ),
            'password' => array
                (
                'type' => 'string',
                'length' => 30
                )
            );
        }
    ?>
    Petite précision, je n'utilise pas de base de données pour l'utilisateur d'ou mon public $useTable = false; dans le modèle.

    Lorsque j'essaie de mauthentifier via le cas cela fonctionne , le système renvoie vers mon index mais la je ne suis pas autorisé donc ilme renvoie vers le login mais qui ne renvoie pas vers CAS car je suis déjà authentifé au niveau du CAS (heureusement au moins cela fonctionne )

    J'ai cherché dans tout les sens, essayé plusieurs autres méthodes mais je ne vois pas ce qui coince...

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

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Es tu certain que l'utilisateur est bien connecté ? Tu peux le vérifier en mettant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    debug($this->Auth->loggedIn());
    dans le beforeFilter du AppController (tu pourras bien le vérifier sur chaque page).

    J'aurai tendance à croire que ta fonction "authenticate" renvoie toujours false...

    Lorsque j'essaie de mauthentifier via le cas cela fonctionne , le système renvoie vers mon index mais la je ne suis pas autorisé
    C'est que je ne comprends pas et qui me fait penser que tu ne t'authentifies pas, par défaut dans cake , si on ne spécifie rien de particulier (et tu ne l'as pas fait), il fait au plus simple : pas authentifié => pas autorisé, authentifié => autorisé (c'est modulable bien entendu).

    Sinon juste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->Auth->allow(array('controller'=>'users','action' => 'login'));
    La syntaxe de cette fonction est incorrecte (la doc). De plus ici elle est inutile car l'action cibler par AuthLogin est toujours autorisée.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

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

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

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    2
    Par défaut
    Salut et meci pour ta réponse, j'ai testé avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    debug($this->Auth->loggedIn());
    il me dit bien false au début puis true une fois authentifié avec CAS et la miracle ça passe. Si j'enlève cette ligne plus rien ne fonctionne.

    J'ai fait différents tests et j'en suis arrivé à juste rajouter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->Auth->loggedIn();
    dans mon beforeFilter du AppController et ça fonctionne impec (bon comprends pas trop pourquoi la et pas ailleurs, si je le met dans mon controller user ça ne fonctionne pas )



    Citation Envoyé par Spartacusply Voir le message
    Sinon juste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->Auth->allow(array('controller'=>'users','action' => 'login'));
    La syntaxe de cette fonction est incorrecte (la doc). De plus ici elle est inutile car l'action cibler par AuthLogin est toujours autorisée.
    non si j'enlève ça impossible d'atteindre la page d'authentification du CAS

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

  4. #4
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    dans mon beforeFilter du AppController et ça fonctionne impec
    Ok, en effet après test, ils s'avère que ce que je t'ai dit avant (pas authentifié => pas autorisé, authentifié => autorisé), n'est pas tout a fait exact, il faut bien quand même faire un appel à une fonction "Auth" pour que la vérification d'authentification s'effectue (la fonction loggedIn le fait et lance le processus de vérification).

    Après pour le faire totalement proprement, et pour reproduire ce comportement, le mieux est d'utiliser le ControllerAuthorize, qui ne nécessite que quelques lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class AppController extends Controller {
        public $components = array(
            'Auth' => array('authorize' => 'Controller'),
        );
        public function isAuthorized($user = null) {
            // Retourne toujours true (si connecté => autorisé)
            return true;
        }
    }
    Là c'est propre, et ça te permet ensuite de facilement moduler au besoin.

    Sinon juste :

    $this->Auth->allow(array('controller'=>'users','action' => 'login'));
    La syntaxe de cette fonction est incorrecte (la doc). De plus ici elle est inutile car l'action cibler par AuthLogin est toujours autorisée.
    non si j'enlève ça impossible d'atteindre la page d'authentification du CAS

    encore merci!!!
    Bon là du coup, je comprends pas, après test ça marche bien chez moi sans cette ligne ^^ (mais bon c'est pas bien grave, l'essentiel c'est que ça fonctionne).

    AU plaisir d'avoir pu aider
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  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 : 49
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Spartacusply Voir le message
    Ok, en effet après test, ils s'avère que ce que je t'ai dit avant (pas authentifié => pas autorisé, authentifié => autorisé), n'est pas tout a fait exact, il faut bien quand même faire un appel à une fonction "Auth" pour que la vérification d'authentification s'effectue (la fonction loggedIn le fait et lance le processus de vérification).
    Oui c'est ce que je me disais un peu en effet

    Citation Envoyé par Spartacusply Voir le message
    Après pour le faire totalement proprement, et pour reproduire ce comportement, le mieux est d'utiliser le ControllerAuthorize, qui ne nécessite que quelques lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class AppController extends Controller {
        public $components = array(
            'Auth' => array('authorize' => 'Controller'),
        );
        public function isAuthorized($user = null) {
            // Retourne toujours true (si connecté => autorisé)
            return true;
        }
    }
    Là c'est propre, et ça te permet ensuite de facilement moduler au besoin.
    J'ai rajouté ça mais ça ne change rien, si je ne met pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      public function beforeFilter() 
                {
                $this->Auth->allow(array('controller'=>'users','action' => 'login'));
                $this->Auth->loggedIn();
                }
    ça ne fonctionne pas... c'est étrange
    Bien reçu, tous les messages. Ils disent qu’ils ont compris, qu’il n’y a plus le choix. Que l’esprit qui souffle, guidera leurs pas. Qu’arrivent les derniers temps où nous pourrons parler. Alors soyons désinvoltes, n’ayons l’air de rien

  6. #6
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Tu reviens sur la page de login avec le message d'erreur ?
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  7. #7
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Bon après quelques tests, même en virant tout le superflu impossible de reproduire ton problème... Tout marche "au mieux" (c'est à dire au plus proche de ce qu'indique la doc), pas trop d'idée là... Cela peux peut-être venir d'un autre bout de code que tu ne montres pas.

    L'essentiel étant toujours que ça fonctionne quand même chez toi (mais ça m'énerve les trucs comme ça ^^)

    AH oui quand même pour info, j'ai testé sur la verson 2.4.6 de Cake.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  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 : 49
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    2
    Par défaut
    oui c'est toujours pénible ce genre de fonctionnement.

    Mais bon ça semble stable je vais donc garder le tout comme ça pour l'instant.

    Ma version de cake et 2.4.2.


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

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

Discussions similaires

  1. [Joomla!] Système d'authentification avec le navigateur
    Par moutey dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 27/04/2009, 17h34
  2. L'authentification avec le systéme SSO
    Par lionel84 dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 02/05/2007, 14h54
  3. Réponses: 2
    Dernier message: 10/05/2006, 07h50
  4. Pas de fenètre d'authentification avec .htaccess
    Par damjal dans le forum Apache
    Réponses: 2
    Dernier message: 02/11/2005, 08h40
  5. [MySQL] mécanisme d'authentification avec BD
    Par lalyly dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 16/10/2005, 13h26

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