Authentification avec LiveUser

Le processus d'authentification repose principalement sur la table «liveuser_users» (ou son équivalent en XML, ...).

La table «liveuser_users»

Cette table contient une liste de champs de base:

  • auth_user_id: l'identifiant utilisé lors du processus de login (authentification). Il est utilisé pour le lier à un identifiant pour la partie Permissions stocké dans la table «liveuser_perm_user»
  • handle: le nom d'utilisateur utilisé lors du processus de login
  • passwd: le mot de passe pour effectuer l'identification. Si activé dans le fichier de configuration, the mot de passe sera encrypté.
  • lastlogin: la date et l'heure à laquelle l'utilisateur s'est identifié la dernière fois
  • owner_user_id: ?
  • owner_group_id: ?
  • is_active: booléen indiquant si le compte utilisateur est toujours actif. Notez que l'authentification est refusée aux comptes inactifs.

Cette liste de champs peut être étendue ultérieurement suivant les besoins. Nous verrons par la suite comment procéder.

La configuration

Le fichier de configuration est principalement un tableau de tous les paramètres utilisés pour la gestion de l'authentification et des permissions. Vous définissez notament tous les conteneurs (containers) à utiliser.

Dans cet exemple, nous utiliserons seulement un conteneur pour l'authentification. Les exemples fournis avec le package LiveUser vous permettrons d'accéder à des données XML et des informations provenant de bases de données diverses.

Voici le fichier de configuration utilisé. Quelques paramètres sont expliqués ci-dessous.

Télécharger 'conf.php'

Code
getMessage() . ' ' . $db->getUserInfo();
  }

$db->setFetchMode(MDB2_FETCHMODE_ASSOC);

$conf =
    array(
        'debug' => true,
        'session'  => array(
            'name'     => 'PHPSESSION',           // liveuser session name
            'varname'  => 'ludata'                // liveuser session var name
        ),
        'login' => array(
            'force'    => false                   // should the user be forced to login
        ),
        'logout' => array(
            'destroy'  => true                    // whether to destroy the session on logout
        ),
        'authContainers' => array(
            array(
                'type'          => 'MDB2',        // auth container name
                'expireTime'    => 3600,          // max lifetime of a session in seconds
                'idleTime'      => 1800,          // max time between 2 requests
                'allowDuplicateHandles' => 0,
                'allowEmptyPasswords'   => 0,     // 0=false, 1=true
                'passwordEncryptionMode'=> 'MD5',
                'storage' => array(
                    'dsn' => $dsn,
                    'alias' => array(             // contains any additional
                                                  // or non-default field alias
                        'lastlogin' => 'last_login',
                        'is_active' => 'is_active',
                        'owner_user_id' => 'owner_user_id',
                        'owner_group_id' => 'owner_group_id',
                        'email' => 'email'
                    ),
                    'fields' => array(            // contains any additional
                                                  // or non-default field types
                        'lastlogin' => 'timestamp',
                        'is_active' => 'boolean',
                        'owner_user_id' => 'integer',
                        'owner_group_id' => 'integer',
                        'email' => 'text'
                    ),
                    'tables' => array(            // contains additional tables
                                                  // or fields in existing tables
                        'users' => array(
                            'fields' => array(
                                'lastlogin' => false,
                                'is_active' => false,
                                'owner_user_id' => false,
                                'owner_group_id' => false,
                                'email' => false
                            )
                        )
                    )
                )
            )
        )
    );

PEAR::setErrorHandling(PEAR_ERROR_RETURN);

$LU = LiveUser::singleton($conf);

if (!$LU->init()) {
    var_dump($LU->getErrors());
    die();
}
$handle = (array_key_exists('handle', $_REQUEST)) ? $_REQUEST['handle'] : null;
$passwd = (array_key_exists('passwd', $_REQUEST)) ? $_REQUEST['passwd'] : null;
$logout = (array_key_exists('logout', $_REQUEST)) ? $_REQUEST['logout'] : false;
if ($logout)
  {
//  $LU->logout(true);
  $LU->logout(false);                       // does not delete the RememberMe cookie
  }
elseif(!$LU->isLoggedIn() || ($handle && $LU->getProperty('handle') != $handle))
  {
  if (!$handle)
    {
    $LU->login(null, null, true);
    }
  else
    {
    $LU->login($handle, $passwd, false);
    }
  }

?>

Pour les fonctions d'authentification, vous portez attention au tableau «authContainers».

Code

   ...
        ),
        'authContainers' => array(
            array(
                'type'          => 'MDB2',        // auth container name
                'expireTime'    => 3600,          // max lifetime of a session in seconds
                'idleTime'      => 1800,          // max time between 2 requests
                'allowDuplicateHandles' => 0,
  ...

Ajouter un champ dans la table

Comment ajouter un champ dans la table liveuser_users?

  1. Premièrement, ajoutez le champ dans la base de données: exemple, la zone «email» comme texte (max. 100 caractères)
  2. Ensuite ajoutez une ligne dans la table «alias» dans la partie «authContainers» du fichier de configuration
  3. Ajoutez une ligne dans le tableau «fields». Indiquez le type de donnée que ce champ contient: timestamp, boolean, integer ou text (ou...?)
  4. Ajoutez une ligne dans le tableau tables/users/fields
Code
   ...
   $auth_conf = array(
   ...
                    'alias' => array( 
                        'lastlogin' => 'lastlogin',
                        'is_active' => 'is_active',
                        'owner_user_id' => 'owner_user_id',
                        'owner_group_id' => 'owner_group_id',
                        'email' => 'email'
                    ),
                    'fields' => array(
                        'lastlogin' => 'timestamp',
                        'is_active' => 'boolean',
                        'owner_user_id' => 'integer',
                        'owner_group_id' => 'integer',
                        'email' => 'text'
                    ),
                    'tables' => array(
                        'users' => array(
                            'fields' => array(
                                'lastlogin' => false,
                                'is_active' => false,
                                'owner_user_id' => false,
                                'owner_group_id' => false,
                                'email' => false
   ...   

Renommer un champ de base dans la base de données

Comment procéder si vous avez un champ de votre base de données qui porte un nom différent de celui défini en LiveUser? Par exemple, au lieu d'avoir le champ «lastlogin», le champ de votre base de donnéee est «last_login».

Une fois de plus, vous devez modifier la partie «authContainers» du fichier de configuration:

  • ajoutez une ligne dans le tableau «alias» établissant la correspondance dont LiveUser a besoin
Code
   ...
   $auth_conf = array(
   ...
                    'alias' => array(
                        'lastlogin' => 'last_login',
   ...

Autres changements

Permettre les mots de passe vides

Vous pouvez indiquer si LiveUser peut tenter une identification avec un mot de passe vide grâce à «allowEmptyPasswords». Indiquez «0» si vous ne permettez pas que l'identification s'effectue sans mot de passe. Indiquez «1» si les mots de passe vides sont autorisés.

Code
   ...
        'authContainers' => array(
            array(
                'type'          => 'MDB2',
                'expireTime'    => 3600,
                'idleTime'      => 1800,
                'allowDuplicateHandles' => 0,
                'allowEmptyPasswords'   => 0,
   ...

Modifier le mode d'encryption du mot de passe

Le mode d'encryption par défaut est MD5. Cet algorithme d'encryption ne permet pas le décrypage du mot de passe. Si vous voulez passer à l'algorythme d'encryption RC4, vous pouvez essayer ce qui suit:

  • Modifiez «passwordEncryptionMode» en indiquant la valeur «RC4» dans le fichier de configuration
  • Si elle n'est pas présente, ajoutez la zone «secret» qui représente la clé secrète que l'algorythme d'encryption doit utiliser
Code
   ...
   $auth_conf = array(
                'type'          => 'MDB2',
                'expireTime'    => 3600,
                'idleTime'      => 1800,
                'allowDuplicateHandles' => 0,
                'allowEmptyPasswords'   => 0,
                'passwordEncryptionMode'=> 'RC4',
                'secret'        => 'test',
   ...

Changer de couche d'abstraction de la base de données: de MDB2 vers DB

Si vous voulez passer de MDB2 à DB, quelques adaptations du fichier de configuration sont nécessaires:

  1. remplacez require_once MDB2.php par require_once DB.php
  2. remplacez $db =& MDB2::connect($dsn); par $db =& DB::connect($dsn);
  3. remplacez $db->setFetchMode(MDB2_FETCHMODE_ASSOC); par $db->setFetchMode(DB_FETCHMODE_ASSOC);
  4. remplacez 'type'=> 'MDB2' par 'type'=> 'DB' dans le tableau de configuration 'auth'
  5. Remplacez le nom du stockage de masse de MDB2' vers 'DB' dans la table de configuration 'perm'

Ajouter le «Remember Me»

Lorsque le login est effectué avec «Remember Me» actif, les informations de login seront stockées dans un cookie, si ceux-ci sont autorisés par navigateur du client. Ensuite, lorsque le visiteur revient, il ne devra plus effectuer le login.

Si vous voulez rendre «Remember Me» actif:

  1. ajoutez une case à cocher (checkbox) à votre formulaire de login de telle sorte que l'utilisateur puisse choisir d'activer ou non cette fonction
  2. ajoutez un tableau «cookie» dans le fichier de configuration
  3. assurez-vous que les instructions d'identification de LiveUser utilisent les valeurs du formulaire
Code
   ...
        'logout' => array(
            'destroy'  => true
        ),
        'cookie' => array(
            'name' => 'loginInfo',  // name of the Remember me cookie
            'lifetime' => 30,       // cookie lifetime in days
            'path' => null,         // cookie path ?
            'domain' => null,       // cookie domain ?
            'secret' => 'test',     // the encryption key for the RC4 algorithm
            'savedir' => '.',       // absolute path to writeable directory ?
                                    // (no trailing slash)
            'secure' => false,      // whether cookie only send over secure connection
        ),
        'authContainers' => array(
  ...

En fonction de la manière dont vous implémentez la sortie du système, le cookie peut ou non être supprimé pendant la sortie. Si vous utilisez le fichier de configuration au sommet de cette page, la sortie provoque la perte du cookie. Si vous voulez un cookie persistant après la sortie, vous devez adapter la ligne logout comme suit:

Code
   ...
$logout = (array_key_exists('logout', $_REQUEST)) ? $_REQUEST['logout'] : false;
$remember = (array_key_exists('rememberMe', $_REQUEST)) ? $_REQUEST['rememberMe'] : false;
if ($logout)
  {
  $LU->logout(false);
  }
...

Notez que la fonction «Remember Me» nécéssite soit l'extention mcrypt, soit le paquet PEAR::Crypt_RC4.

Contactez-nous!

Nous aimerions vous etendre, savoir ce que vous pensez de cette page ou ce que nous pouvons faire pour vous.

Contactez-nous

Visualisez cette page avec IE8+, Mozilla Firefox, Safari, Chrome et les mobiles

Dernière modification le 21 mai 2015 par Stéphane Van Nerom

© 2006-2014 - GVN - tous droits réservés
v2.0.14