Aller au contenu

Classe lrSession

Role

Gestion de sessions persistantes : création, lecture, écriture, vérification, rafraîchissement, nettoyage, et codes d’erreur.

A la création de la session, un timeout est défini. Si ce timeout est atteint sans aucun accès en lecture ou écriture, la session est détruite automatiquement.

A chaque lecture, écriture ou vérification de la validité d'une session, le compteur de timeout est réinitialisé. Il est possible de forcer la réinitialisation de la session en utilisant la méthode lrSession:Refresh.

Les données de session peuvent être stockées, selon le paramètre passé à la méthode lrSession:Create :
    - sous forme de paires Clé / Valeur
    - sous forme d'un variant (plus souple et puissant)

Signature de l'ID de session : L'identifiant de session est signé numériquement, ce qui permet de détecter la réception d'un ID illégal et de bloquer toute exécution de requête. Cette signature est calculée en utilisant un buffer stocké dans le membre :Salt (partagé entre toutes les instances de la classe lrSession).

⚠ Si le membre :Salt est modifié en cours d'exécution (par n'importe quelle instance de lrSession), toutes les sessions en cours deviendront illégales. De même, si le serveur est redémarré avec un :Salt différent, les sessions en cours seront inaccessibles.

La valeur par défaut du membre :Salt est définie dans la constante ::DEFAULT_SALT. Il est conseillé de la personnaliser (soit lors de l'exécution soit en modifiant sa valeur dans le code du composant).

Chiffrement des données de session Il est possible (et recommandé), lorsque la sécurité le nécessite, de chiffrer les données de la session (stockées dans le fichier dont le nom = :ID de la session). Pour activer le chiffrement, il faut que le membre :CipheringKey soit défini.

⚠ Si le membre :CipheringKey est modifié en cours d'exécution (par n'importe quelle instance de lrSession), toutes les données des sessions en cours deviendront illisibles. De même, si le serveur est redémarré avec une :CipheringKey différent, les données des sessions en cours seront indéchiffrables.

Membres et propriétés

NomTypeUsage
CipheringKeyBufferClé de chiffrement utilisée pour protéger les données de session.
Intervient lors de la signature et du chiffrement/déchiffrement des informations stockées.
IDchaîneIdentifiant de session.
IsCheckSignaturebooléenActive ou désactive la vérification de la signature de session.
Permet de détecter les sessions falsifiées ou altérées.
LastErrorCodeentierDernier code d’erreur rencontré lors d’une opération.
Correspond à une constante ErrorSession*.
SaltBufferSel utilisé lors des opérations de signature et de chiffrement.
Renforce la sécurité des données de session.
SessionsDirectorychaîneRépertoire contenant les fichiers de session.
Chaque session est généralement persistée dans ce dossier.

Constantes

NomTypeUsage
ErrorSessionExpiredentier0x1000 — Session expirée.
ErrorSessionIllegalentier0x1001 — Session illégale ou identifiant invalide.
ErrorSessionCannotLoadentier0x1002 — Impossible de charger la session.
ErrorSessionCannotSaveentier0x1003 — Impossible de sauver la session.
ErrorSessionCannotSetValueentier0x1004 — Impossible d’écrire une valeur dans la session.
ErrorSessionCannotDestroyentier0x1005 — Impossible de détruire la session.
ErrorSessionCannotDecipherentier0x1006 — Impossible de déchiffrer les données de session.
ErrorSessionCannotGetValueentier0x1007 — Impossible de lire une valeur de session.

Méthodes

Create(Durée)

📘 Présentation
Crée une session avec un timeout de type Durée.

🧩 Prototypage
Create(pTimeout est Durée = 3600s) : booléen

🔧 Paramètres
NomTypeUsage
pTimeoutDuréeDurée de vie de session.

↩️ Valeurs retournées
TypeUsage
booléenVrai si la session est créée.

🧪 Exemple

Création d’une session avec un timeout exprimé en Durée.

FUNCTION GetSession(pRequest est objet lrRequest <utile>, poResponse est objet lrResponse)

oSess        est objet lrSession
duTimeout    est Durée

duTimeout..EnSecondes = 3600

SI oSess:Create(duTimeout) ALORS
    poResponse:SetHeaderValue("SESSION_ID", oSess:ID)
    poResponse:Status        = lrResponse::StatusOK
    poResponse:Body          = "Session [%oSess:ID%] created."
    poResponse:ContentType   = lrResponse::ContentTXT
SINON
    poResponse:Status        = lrResponse::StatusInternalServerError
    poResponse:Body          = oSess:GetErrorMessage(oSess:LastErrorCode)
    poResponse:ContentType   = lrResponse::ContentTXT
FIN

Create(secondes)

📘 Présentation
Crée une session et initialise ses métadonnées (création, accès, timeout).

ℹ Fonction dépréciée, utiliser plutôt la syntaxe avec un paramètre de type Durée

🧩 Prototypage
Create(pTimeout est entier = 3600) : booléen

🔧 Paramètres
NomTypeUsage
pTimeoutentierDurée de vie en secondes.

↩️ Valeurs retournées
TypeUsage
booléenVrai si la session est créée.

🧪 Exemple

Création d’une session avec un timeout exprimé en secondes.

FUNCTION GetSession(pRequest est objet lrRequest <utile>, poResponse est objet lrResponse)

oSess est objet lrSession

SI oSess:Create(3600) ALORS
    poResponse:SetHeaderValue("SESSION_ID", oSess:ID)
    poResponse:Status        = lrResponse::StatusOK
    poResponse:Body          = "Session [%oSess:ID%] created."
    poResponse:ContentType   = lrResponse::ContentTXT
SINON
    poResponse:Status        = lrResponse::StatusInternalServerError
    poResponse:Body          = oSess:GetErrorMessage(oSess:LastErrorCode)
    poResponse:ContentType   = lrResponse::ContentTXT
FIN

Check

📘 Présentation
Vérifie la validité de la session (existence, expiration, signature si activée).

🧩 Prototypage
Check() : (booléen, entier)

🔧 Paramètres
(aucun)

↩️ Valeurs retournées
TypeUsage
booléenVrai si session valide.
entier0 si OK, sinon un code ErrorSession*.

🧪 Exemple

Vérification de la validité d’une session avant traitement.

FUNCTION GetCustomer(poRequest est objet lrRequest, poResponse est objet lrResponse)

oSess est objet lrSession


oSess:ID = poRequest:GetHeaderValue("SESSION_ID")

SI oSess:ID = "" ALORS
    poResponse:Status        = lrResponse::StatusBadRequest
    poResponse:Body          = "Missing SESSION ID"
    poResponse:ContentType   = lrResponse::ContentTXT
    RETOUR
FIN

SI pas oSess:Check() ALORS
    poResponse:Status        = lrResponse::StatusUnauthorized
    poResponse:Body          = oSess:GetErrorMessage(oSess:LastErrorCode)
    poResponse:ContentType   = lrResponse::ContentTXT
    RETOUR
FIN

//On rafraîchit la session pour éviter un timeout d'inactivité
oSess:Refresh()

//////////// Suite du traitement ///////////

Refresh

📘 Présentation
Rafraîchit la session en mettant à jour l'horodateur de dernier accès de session (prolonge l’activité jusqu'à atteinte du timeout d'inactivité).

🧩 Prototypage
Refresh() : (booléen, entier)

🔧 Paramètres
(aucun)

↩️ Valeurs retournées
TypeUsage
booléenVrai si succès.
entier0 si OK, sinon un code ErrorSession*.

🧪 Exemple

Exemple : prolonger l’activité d’une session.

(bOK, eErr) = oSess:Refresh()

GetData(clé)

📘 Présentation
Récupère une valeur de session par sa clé préalablement stockée avec la méthode SetData(pTag, pValue).

🧩 Prototypage
GetData(pTag est chaîne) : (booléen, Variant)

🔧 Paramètres
NomTypeUsage
pTagchaîneNom du tag (clé).

↩️ Valeurs retournées
TypeUsage
booléenVrai si succès.
VariantValeur si succès sinon un code d’erreur.

🧪 Exemple

Exemple : lecture d’une valeur stockée en session.

(bOK, vVal) = oSess:GetData("user")

GetData()

📘 Présentation
Récupère le variant des données de la session, préalablement stocké avec la méthode :SetData(pVariant).

🧩 Prototypage
GetData() : (booléen, Variant)

🔧 Paramètres
(aucun)

↩️ Valeurs retournées
TypeUsage
booléenVrai si succès.
VariantValeur si succès (sinon, selon implémentation, un code d’erreur).

🧪 Exemple

Exemple : lecture du variant contenant les données de session.

vSessionData est variant

(bOK, vSessionData) = oSess:GetData()

GetAllData

📘 Présentation
Retourne toutes les données de session (clé/valeur) dans un tableau associatif, préalablement stockées avec la méthode SetData(pTag, pValue).

🧩 Prototypage
GetAllData() : (booléen, tableau associatif de Variant)

🔧 Paramètres
(aucun)

↩️ Valeurs retournées
TypeUsage
booléenVrai si succès.
tableau associatif de VariantToutes les données applicatives.

🧪 Exemple

Exemple : récupération de toutes les données d’une session.

vSessionData est variant

(bOK, vSessionData) = oSess:GetAllData()

SetData(clé, valeur)

📘 Présentation
Mémorise une paire clé/valeur dans les données de session

🧩 Prototypage
SetData(pTag est chaine, pValue est variant) : (booléen, entier)

🔧 Paramètres
NomTypeUsage
pTagChaîneNom de la clé

↩️ Valeurs retournées
TypeUsage
booléenVrai si succès.
entier0 si OK, sinon un code ErrorSession*.

🧪 Exemple

Ecriture d'une donnée clé/valeur dans le données de la session

(bOK, eErr) = oSess:SetData("nom", "toto")

SetData(variant)

📘 Présentation
Mémorise des données de session sous forme de variant.

Permet de récupérer l'ensemble des données de session en une seule lecture, et donc un seul déchiffrement (au lieu d'effectuer plusieurs accès avec la syntaxe SetData(pTag, pValue), donc meilleure performance).

🧩 Prototypage
SetData(pValues est Variant) : (booléen, entier)

🔧 Paramètres
NomTypeUsage
pValuesVariantObjet Variant dont les propriétés sont les clés et valeurs à enregistrer.

↩️ Valeurs retournées
TypeUsage
booléenVrai si succès.
entier0 si OK, sinon un code ErrorSession*.

🧪 Exemple

Ecriture de plusieurs valeurs dans la session.

v est Variant
v.user = 123
v.role = "admin"
(bOK, eErr) = oSess:SetData(v)

Destroy

📘 Présentation
Détruit la session et libère les ressources associées, utilisé principalement à la fermeture de la session client.

🧩 Prototypage
Destroy() : (booléen, entier)

🔧 Paramètres
(aucun)

↩️ Valeurs retournées
TypeUsage
booléenVrai si succès.
entier0 si OK, sinon un code ErrorSession*.

🧪 Exemple

Suppression explicite d’une session.

(bOK, eErr) = oSess:Destroy()

Cleanup

📘 Présentation
Nettoie les sessions expirées (dont le timeout d'inactivité a été dépassé).

ℹ Cette méthode est appelée automatiquement chaque minute par la classe lrSession, il est donc inutile (mais possible) de l'appeler depuis le code du serveur LightREST.

🧩 Prototypage
Cleanup()

🔧 Paramètres
(aucun)

↩️ Valeurs retournées
(aucune)

🧪 Exemple

Nettoyage des sessions expirées.

oSession:Cleanup()

GetErrorMessage

📘 Présentation
Retourne le message à un code :ErrorSession*.

🧩 Prototypage
GetErrorMessage(pErrorMessage est entier) : chaîne

🔧 Paramètres
NomTypeUsage
pErrorMessageentierCode d’erreur ErrorSession*.

↩️ Valeurs retournées
TypeUsage
chaîneMessage correspondant.

🧪 Exemple

Conversion d’un code d’erreur en message lisible.

(bOK, eErr) = oSession:Check()
SI PAS bOK alors
    poResponse:Status        = lrResponse::StatusUnauthorized
    poResponse:Body          = oSess:GetErrorMessage(eErr)
    poResponse:ContentType   = lrResponse::ContentTXT

FIN

GetLastAccess

📘 Présentation
Renvoie la date/heure du dernier accès à la session.

🧩 Prototypage
GetLastAccess()

🔧 Paramètres
(aucun)

↩️ Valeurs retournées
TypeUsage
ChaîneHorodateur du denier accès au format AAAAMMJJHHMMSSCC

🧪 Exemple

Récupération de l'horodateur du dernier accès à la session.

sLastAccess = oSess:GetLastAccess()

GetTimestamp

📘 Présentation
Récupère la date/heure de création de la session.

🧩 Prototypage
GetTimestamp()

🔧 Paramètres
(aucun)

↩️ Valeurs retournées
TypeUsage
ChaîneHorodateur dz créatioon de la session au format AAAAMMJJHHMMSSCC

🧪 Exemple

Récupération de l'horodateur de création de la session.

sCreationTS = oSess:GetTimeStamp()

SetCipheringKey

Compatibilite v2

Signature conservee pour compatibilite LightREST v2.

Deprecie

Conserve pour compatibilite. Preferer l'alternative recommandee.

📘 Présentation
Définit la clé de chiffrement.

🧩 Prototypage
SetCipheringKey(pKey est Buffer)

🔧 Paramètres
NomTypeUsage
pKeyBufferClé de chiffrement.

↩️ Valeurs retournées
(aucune)

🧪 Exemple

Définition de la clé de chiffrement

oSess:SetCipheringKey("ma-cle-de-chiffrement")