Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] [Résolu] utiliser son propre driver d'authentification - SSO CAS

Posted by tatoun59 on 01/22/2013 14:37

Bonjour,

J'ai une install fraîche (1.4.2) avec une interface d'admin générée avec initadmin et le point d'entrée admin. Cela fonctionne correctement.
Je voudrais maintenant remplacer le driver db de jauth par mon propre driver
myapp/plugins/auth/cas.auth.php

Dans auth.coord.ini.php, j'ai remplacé driver=Db par driver=cas et j'ai ajouté une section [cas]

Malgré cela, lorsque j'appelle myapp/www/admin.php ce n'est pas mon driver qui est appelé mais toujours l'ancien myapp/www/admin.php/jauth/login/form?auth_url_return=...

Une idée ?

Merci

  [Opened] utiliser son propre driver d'authentification

Reply #1 Posted by foxmask on 01/22/2013 15:15

Bonjour, hier nous vous conseillions ceci :

11:08 <@foxmask> et tu créé un plugin d'auth que tu configure dans le fichier de config de "tonappli"
11:09 < gperes> ouuuuuuuuuuuuuuuuu c'est facile ça ? :p
11:09 <@foxmask> gperes: très
11:09 <@foxmask> gperes: avec la doc c'est trop fastoche :)
11:09 <@laurentj> gperes: les lib externes, tu les mets où tu veux. à priori dans le module qui l'utilise
11:10 <@foxmask> laurentj: et là pour un SSO tu le mettrais pas ici tonappli/plugins/auth/ ?
11:10 <@laurentj> gperes: et pourlun plugin auth : http://docs.jelix.org/fr/manuel-1.4/plugins/auth
11:10 < gperes> laurentj > comme j'expliquais à foxmask, je veux que le déploiement soit pratique, qu'à la prochaine install je n'oublie pas de le déployer. Après, c'est le fait que ce soit une lib php dédié à une connexion CAS-SSO, je voulais faire un truc propre
11:11 <@foxmask> gperes: ben AMHA dans tonappli/plugins/auth/ ; c'est propre
11:11 <@laurentj> gperes: donc à priori, tu te fais un module dédié à ce type d'authentification, qui embarque la lib externe, ton plugin auth etc.
11:11 <@laurentj> foxmask: comme il y a des dépendances, vaut mieux un module
11:12 <@laurentj> le module permet aussi de créer un script d'install
11:12 <@foxmask> ok
11:12 <@foxmask> donc tonappli/lebo_module_cassso/plugins/auth
11:12 <@laurentj> bref, le plugin peut aller dans tonapp/modules/tonmodule/plugins/auth
11:12 <@laurentj> bref, le plugin peut aller dans tonapp/modules/tonmodule/plugins/auth
11:13 <@foxmask> oui vala
11:13 < gperes> ok merci les gars


@GitHub - Forum HaveFnuBB! powered by Jelix - Le Booster Jelix !

  [Opened] utiliser son propre driver d'authentification

Reply #2 Posted by tatoun59 on 01/22/2013 15:24

désolé, je ne suis pas le "gperes" de votre conversation d'hier soir ;-)

Mon problème reste donc entier...

  [Opened] utiliser son propre driver d'authentification

Reply #3 Posted by foxmask on 01/22/2013 15:30

ah marrant on dirait la meme conversation, désolé ;)

cependant les conseils sont les memes :)

Faire un module CAS qui fournisse le plugin d'auth CAS dans un dossier monapp/modules/monmodule/plugins/auth

Ensuite le configurer comme vous l'avez deja fait + ajouter dans le fichier defaultconfig.ini.php dans la variable pluginPath, le path monapp/modules/monmodule/plugins/auth

et jetter un oeil sur la doc


@GitHub - Forum HaveFnuBB! powered by Jelix - Le Booster Jelix !

  [Opened] utiliser son propre driver d'authentification

Reply #4 Posted by khena on 01/29/2013 10:22

Je tiens à préciser que je n'ai aucun rapport avec ce tatou, c'est juste le hasard ! Je suis en train de faire le CAS, c'est j'ai toujours quelques problèmes, plutot liés phpCAS je pense.

tatou59, ton problème c'est à mon avis le pluginPath.

Pour le CAS, la difficulté est que le controleur ne doit pas être celui de jAuth : la bibliotheque phpCAS redirige automatiquement sur son propre système (par exemple LemonLdap) qui lui se chargera de rediriger ensuite vers Jelix.

Dès que j'ai fini le driver, j'esseyerai de le partager avec tout le monde

@+ (sur Irc) khena (gperes)

  [Opened] utiliser son propre driver d'authentification

Reply #5 Posted by tatoun59 on 01/29/2013 15:25

Pour ma part, l'appel au driver CAS se fait bien. L'url localhost/test1/www/ redirige bien vers l'url
https://serveur.cas/login?service=http://localhost/test1/www/
et après saisie du login/mdp, on est redirigé vers
http://localhost/test1/www/?ticket=...

Seulement, j'obtiens une page vide (dans firefox) et Chrome donne le message suivant :
Erreur HTTP 500 (Internal Server Error) : Une situation inattendue s'est produite tandis que le serveur tentait de traiter la demande.

Le serveur CAS doit normalement retourner un ticket et l'identifiant utilisateur (uid)

Mon driver CAS (cas.auth.php) :

<?php
require_once 'CAS/CAS.php';
// le strict n'est pas géré par phpCAS
error_reporting(0);
class casAuthDriver implements jIAuthDriver {
    protected $_params;
    function __construct($params){
        $this->_params = $params;
        phpCAS::client(CAS_VERSION_2_0,'serveur.cas',443,'');
        phpCAS::forceAuthentication();
    }

    public function saveNewUser($user){}
    public function removeUser($login){}
    public function updateUser($user){}

    public function getUser($uid){
        $uid = phpCAS::getUser();
        return $uid ;
    }

    public function createUserObject($login,$password){}
    public function getUserList($pattern){}
    public function changePassword($login, $newpassword){}
    public function verifyPassword($login, $password){}
}
?>

auth.coord.ini.php :

;<?php die(''); ?>
driver=cas
session_name=JELIX_USER
secure_with_ip=0
timeout=30
auth_required=on
on_error=2
error_message="jauth~autherror.notlogged"
on_error_action="test1~default:log_in"
bad_ip_action="jauth~login:out"
on_error_sleep=3
after_login="test1~default:index"
after_logout="jauth~login:form"
enable_after_login_override=off
enable_after_logout_override=off
persistant_enable=off
persistant_crypt_key=exampleOfCryptKey
persistant_cookie_name=jelixAuthentificationCookie
persistant_duration=1

[cas]

Mon controleur :

<?php
class defaultCtrl extends jController {
    function index() {
        $rep = $this->getResponse('html');
        $rep->body->assignZone('MAIN', 'jelix~check_install');
        return $rep;
    }
    
    function log_in() {
        $uid = jauth::getUser();
        $rep = $this->getResponse('redirect');
        $rep->action = "test1~default:index";
        return $rep;
    }
}

Avec CAS, on n'a pas à gérer le formulaire de connexion car le serveur CAS s'en charge. Le problème est donc d'appeler CAS et de récupérer l'uid pour ensuite le comparer à ceux stockés dans sa table utilisateurs. Apparemment, dans mon cas, le retour se passe mal ;-)

  [Opened] utiliser son propre driver d'authentification

Reply #6 Posted by khena on 01/29/2013 16:35

Salut,

tu n'as oublié de déclarer dans ton controleur :

public $pluginParams = array(
      '*'=>array('auth.required'=>false)
    );

afin qu'il évite de repasser par la sécurité? En plus, il me semble que c'est jAuth et pas jauth (à moins que les deux ne fonctionnent...)

Pour ma part, j'ai terminé mes pbs de connexion au serveur CAS, je suis un peu bloqué comme toi (même si j'ai implémenté le code différement). Et j'ai une belle boucle de redirection...

Mon driver CAS

class casAuthDriver implements jIAuthDriver{

    function __construct($params){
    	phpCAS::client(CAS_VERSION_2_0, $params['hostname'],intval($params['port']),$params['context']);
		phpCAS::setDebug("/tmp/casdebug.log");    	    
    	phpCAS::setNoCasServerValidation();				
    }
    public function createUserObject($login, $password);
    public function saveNewUser($user);
    public function removeUser($login);
    public function updateUser($user);
    public function getUser($login);    
    public function getUserList($pattern);

    public function changePassword($login, $newpassword);

    public function verifyPassword($login, $password){
    	phpCAS::forceAuthentication();
		$user = new stdClass();
		$user->login = $login;
		$user->password  = $password;		
		return $user;	
    }
}

mon controller :

class casauthCtrl extends jController {

    public $pluginParams = array(
      '*'=>array('auth.required'=>false)
    );	
	
    function out (){
        $conf = jApp::coord()->getPlugin('auth')->config;
		jAuth::logout();
		
        jAuth::login($this->param('login'), $this->param('password'));

        $rep = $this->getResponse('redirect');
        $rep->action = $conf["after_login"];
        return $rep;
    }
	
	function redirect (){
		$rep = $this->getResponse('redirectUrl');
		$rep->url = "https://yyyy.xxxx.fr";
		return $rep;
	}
}

ma config

on_error_action = "default~casauth:out"
bad_ip_action = "default~casauth:out"
on_error_sleep = 3
after_login = "default~default:index"
after_logout = "default~casauth:redirect"
enable_after_login_override = off
enable_after_logout_override = off

Je viens bien finir par trouver...

tatoun49 : le détail de ton erreur 500 doit être dans var/log/error.php

  [Opened] utiliser son propre driver d'authentification

Reply #7 Posted by khena on 01/29/2013 16:50

Petite précision : je réussis à enlever la boucle de redirection en donnant la même réponse à mon driver pour les fonctions getUser et verifyPassword :

return phpCAS::getUser();

Je suppose que Jelix utilise ces fonctions pour comparer les variables en session et vérifier que le user est bien connecté.

Par contre, maintenant j’atterris sur une page blanche (au lieu d'être redirigé vers mon index).

  [Opened] utiliser son propre driver d'authentification

Reply #8 Posted by khena on 01/29/2013 17:08

Je continue de compléter ce sujet : le problème ne vient-il pas du fait que jAuth::login, qui utilise phpCAS::forceAuthentication(), est une redirection vers un serveur externe (le CAS en l'occurence).

Si on fait le cheminement des datas :

  1. le user demande l'url index
  2. jAuth ne le trouve pas, on rentre donc dans le controlleur
  3. login redirige vers le serveur CAS avec l'url d'index en mémoire
  4. le user s'authentifie au cas
  5. le serveur cas redirige vers l'url index (en externe donc)

... sauf qu'ici, Jelix n'a toujours pas validé la session de l'utilisateur (car il a été "coupé" par jAuth::login, et on revient donc au point 2 -> ça boucle

et du coup, ce que je comprends pas, c'est comment j'arrive à sortir de cette boucle (et d'où vient la page blanche de mon précédent message)?

  [Opened] utiliser son propre driver d'authentification

Reply #9 Posted by tatoun59 on 01/29/2013 17:17

khena a dit :
Salut,

tu n'as oublié de déclarer dans ton controleur :

<code>public $pluginParams = array(
'*'=>array('auth.required'=>false)
);</code>

Ah oui, c'est vrai, j'avais lu ça...
mais je me demande si dans mon cas, je ne devrais pas mettre

'log_in'=>array('auth.required'=>false)

car si je mets

'*'=>array('auth.required'=>false)

index() n'aura plus besoin d'authentification or, c'est mon point d'entrée

afin qu'il évite de repasser par la sécurité? En plus, il me semble que c'est jAuth et pas jauth (à moins que les deux ne fonctionnent...)

apparemment, les 2 fonctionnent

tatoun49 : le détail de ton erreur 500 doit être dans var/log/error.php

j'avais regardé mais mon fichier errors.log est vide. J'ai donc l'impression que c'est une erreur 500 due au serveur apache et non à jelix...

 
Page
  1. Re: utiliser son propre driver d'authentification