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
| Nom | Type | Usage |
|---|---|---|
CipheringKey | Buffer | Clé 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. |
ID | chaîne | Identifiant de session. |
IsCheckSignature | booléen | Active ou désactive la vérification de la signature de session. Permet de détecter les sessions falsifiées ou altérées. |
LastErrorCode | entier | Dernier code d’erreur rencontré lors d’une opération. Correspond à une constante ErrorSession*. |
Salt | Buffer | Sel utilisé lors des opérations de signature et de chiffrement. Renforce la sécurité des données de session. |
SessionsDirectory | chaîne | Répertoire contenant les fichiers de session. Chaque session est généralement persistée dans ce dossier. |
Constantes
| Nom | Type | Usage |
|---|---|---|
ErrorSessionExpired | entier | 0x1000 — Session expirée. |
ErrorSessionIllegal | entier | 0x1001 — Session illégale ou identifiant invalide. |
ErrorSessionCannotLoad | entier | 0x1002 — Impossible de charger la session. |
ErrorSessionCannotSave | entier | 0x1003 — Impossible de sauver la session. |
ErrorSessionCannotSetValue | entier | 0x1004 — Impossible d’écrire une valeur dans la session. |
ErrorSessionCannotDestroy | entier | 0x1005 — Impossible de détruire la session. |
ErrorSessionCannotDecipher | entier | 0x1006 — Impossible de déchiffrer les données de session. |
ErrorSessionCannotGetValue | entier | 0x1007 — Impossible de lire une valeur de session. |
Méthodes¶
Create(Durée)
Create(pTimeout est Durée = 3600s) : booléen
| Nom | Type | Usage |
|---|---|---|
pTimeout | Durée | Durée de vie de session. |
| Type | Usage |
|---|---|
| booléen | Vrai si la session est créée. |
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
FINCreate(secondes)
Fonction dépréciée, utiliser plutôt la syntaxe avec un paramètre de type Durée
Create(pTimeout est entier = 3600) : booléen
| Nom | Type | Usage |
|---|---|---|
pTimeout | entier | Durée de vie en secondes. |
| Type | Usage |
|---|---|
| booléen | Vrai si la session est créée. |
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
FINCheck
Check() : (booléen, entier)
| Type | Usage |
|---|---|
| booléen | Vrai si session valide. |
| entier | 0 si OK, sinon un code ErrorSession*. |
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
Refresh() : (booléen, entier)
| Type | Usage |
|---|---|
| booléen | Vrai si succès. |
| entier | 0 si OK, sinon un code ErrorSession*. |
Exemple : prolonger l’activité d’une session.
(bOK, eErr) = oSess:Refresh()GetData(clé)
GetData(pTag est chaîne) : (booléen, Variant)
| Nom | Type | Usage |
|---|---|---|
pTag | chaîne | Nom du tag (clé). |
| Type | Usage |
|---|---|
| booléen | Vrai si succès. |
| Variant | Valeur si succès sinon un code d’erreur. |
Exemple : lecture d’une valeur stockée en session.
(bOK, vVal) = oSess:GetData("user")GetData()
GetData() : (booléen, Variant)
| Type | Usage |
|---|---|
| booléen | Vrai si succès. |
| Variant | Valeur si succès (sinon, selon implémentation, un code d’erreur). |
Exemple : lecture du variant contenant les données de session.
vSessionData est variant
(bOK, vSessionData) = oSess:GetData()GetAllData
GetAllData() : (booléen, tableau associatif de Variant)
| Type | Usage |
|---|---|
| booléen | Vrai si succès. |
| tableau associatif de Variant | Toutes les données applicatives. |
Exemple : récupération de toutes les données d’une session.
vSessionData est variant
(bOK, vSessionData) = oSess:GetAllData()SetData(clé, valeur)
SetData(pTag est chaine, pValue est variant) : (booléen, entier)
| Nom | Type | Usage |
|---|---|---|
pTag | Chaîne | Nom de la clé |
| Type | Usage |
|---|---|
| booléen | Vrai si succès. |
| entier | 0 si OK, sinon un code ErrorSession*. |
Ecriture d'une donnée clé/valeur dans le données de la session
(bOK, eErr) = oSess:SetData("nom", "toto")SetData(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).
SetData(pValues est Variant) : (booléen, entier)
| Nom | Type | Usage |
|---|---|---|
pValues | Variant | Objet Variant dont les propriétés sont les clés et valeurs à enregistrer. |
| Type | Usage |
|---|---|
| booléen | Vrai si succès. |
| entier | 0 si OK, sinon un code ErrorSession*. |
Ecriture de plusieurs valeurs dans la session.
v est Variant
v.user = 123
v.role = "admin"
(bOK, eErr) = oSess:SetData(v)Destroy
Destroy() : (booléen, entier)
| Type | Usage |
|---|---|
| booléen | Vrai si succès. |
| entier | 0 si OK, sinon un code ErrorSession*. |
Suppression explicite d’une session.
(bOK, eErr) = oSess:Destroy()Cleanup
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.
Cleanup()
Nettoyage des sessions expirées.
oSession:Cleanup()GetErrorMessage
GetErrorMessage(pErrorMessage est entier) : chaîne
| Nom | Type | Usage |
|---|---|---|
pErrorMessage | entier | Code d’erreur ErrorSession*. |
| Type | Usage |
|---|---|
| chaîne | Message correspondant. |
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
FINGetLastAccess
GetLastAccess()
| Type | Usage |
|---|---|
| Chaîne | Horodateur du denier accès au format AAAAMMJJHHMMSSCC |
Récupération de l'horodateur du dernier accès à la session.
sLastAccess = oSess:GetLastAccess()GetTimestamp
GetTimestamp()
| Type | Usage |
|---|---|
| Chaîne | Horodateur dz créatioon de la session au format AAAAMMJJHHMMSSCC |
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.
SetCipheringKey(pKey est Buffer)
| Nom | Type | Usage |
|---|---|---|
pKey | Buffer | Clé de chiffrement. |
Définition de la clé de chiffrement
oSess:SetCipheringKey("ma-cle-de-chiffrement")