Session
Les objets session sont retournés par la commande Session. Ces objets fournissent au développeur une interface permettant de gérer la session en cours et d'exécuter des actions telles que le stockage de données contextuelles, le partage d'informations entre les process de session, le lancement de process préemptifs liés à la session ou (contexte web uniquement) la gestion des privilèges.
Types de sessions
Les types de sessions suivants sont pris en charge par cette classe :
- Sessions utilisateur Web : Les sessions utilisateur Web sont disponibles lorsque les sessions évolutives (scalable sessions) sont activées dans votre projet. Elles sont utilisées pour les connexions Web (y compris les accès REST) et sont contrôlées par les privilèges qui leur sont attribués.
- Sessions utilisateur distant : Dans les applications client/serveur, les utilisateurs distants ont leurs propres sessions, gérées depuis le client et le serveur.
- Sessions procédures stockées : Session utilisateur virtuelle pour toutes les procédures stockées exécutées sur le serveur.
- Sessions autonomes: Session locale retournée dans une application mono-utilisateur (utile dans les phases de développement et de test des applications client/serveur).
Tous les types de session peuvent gérer des privilèges, mais seul le code exécuté dans un contexte web est réellement contrôlé par les privilèges de la session.
Sommaire
| .clearPrivileges() : Boolean supprime tous les privilèges associés à la session (à l'exception des privilèges promus) et renvoie True si l'exécution a réussi |
| .createOTP ( { lifespan : Integer } ) : Text crée un nouvel OTP (One Time Passcode) pour la session et renvoie son UUID de token |
| .demote( promoteId : Integer ) supprime du process web le privilège promu dont l'identifiant a été passé dans promoteId, s'il a été précédemment ajouté par la fonction .promote() |
| .expirationDate : Text la date et l'heure d'expiration du cookie de session |
| .getPrivileges() : Collection renvoie une collection contenant tous les noms de privilèges associés à la session |
| .hasPrivilege( privilege : Text ) : Boolean renvoie True si le privilege est associé à la session, et False sinon |
| .id : Text l'identifiant unique (UUID) de la session utilisateur |
| .idleTimeout : Integer le délai maximal d'inactivité de session (en minutes), au-delà duquel la session est automatiquement fermée par 4D |
| .info : Object décrit la session |
| .isGuest() : Boolean retourne True tant que setPrivileges() n'est pas appelé dans la session ou après qu'un Qodly logout a été exécuté dans la session |
| .promote( privilege : Text ) : Integer ajoute le privilège défini dans le paramètre privilege au process courant durant l'exécution de la fonction appelante et renvoie l'identifiant du privilège promu |
| .restore ( token : Text ) : Boolean remplace la session courante de l'utilisateur Web par sa session originale correspondant à l'UUID token |
| .setPrivileges( privilege : Text ) : Boolean .setPrivileges( privileges : Collection ) .setPrivileges( settings : Object ) : Boolean associe le ou les privilège(s) et/ou rôle(s) défini(s) en paramètre à la session et renvoie True si l'exécution a réussi |
| .storage : Object un objet partagé qui peut être utilisé pour stocker des informations disponibles pour tous les process de la session |
| .userName : Text le nom d'utilisateur associé à la session |
.clearPrivileges()
Historique
| Release | Modifications |
|---|---|
| 21 | Prise en charge des sessions distantes et autonomes |
| 18 R6 | Ajout |
.clearPrivileges() : Boolean
| Paramètres | Type | Description | |
|---|---|---|---|
| Résultat | Boolean | <- | True si l'exécution est réussie |
Description
La fonction .clearPrivileges() supprime tous les privilèges associés à la session (à l'exception des privilèges promus) et renvoie True si l'exécution a réussi.
- Gardez à l'esprit que les privilèges ne s'appliquent qu'au code exécuté via les accès web, quel que soit le type de session sur lequel cette fonction est exécutée.
- Cette fonction ne supprime pas les privilèges promus du process web, qu'ils aient été ajoutés par le biais du fichier roles.json ou de la fonction
promote(). - Pour des raisons de sécurité, cette fonction ne peut pas être appelée côté client d'une session utilisateur distante (une erreur est renvoyée).
Exemple
//Invalider la session d'un utilisateur web
var $isOK : Boolean
$isOK:=Session.clearPrivileges()
.createOTP()
Historique
| Release | Modifications |
|---|---|
| 21 | Prise en charge des sessions distantes et autonomes |
| 20 R9 | Ajout |
.createOTP ( { lifespan : Integer } ) : Text
| Paramètres | Type | Description | |
|---|---|---|---|
| lifespan | Integer | -> | Durée de vie du token de session en secondes |
| Résultat | Text | <- | UUID du token OTP |
Description
La fonction .createOTP() crée un nouvel OTP (One Time Passcode) pour la session et renvoie son UUID de token. Ce token est propre à la session au cours de laquelle il a été généré.
Vous pouvez définir un délai personnalisé en passant une valeur en secondes dans lifespan. Par défaut, si le paramètre lifespan est omis :
- pour les sessions web, le token est créé avec la même durée de vie que le
.idleTimeOutde la session. - pour les sessions d'utilisateurs distants, le token est créé avec une durée de vie de 10 secondes.
Dans les sessions web, le token renvoyé peut être utilisé dans les échanges avec des applications ou des sites web tiers pour identifier la session en toute sécurité. Par exemple, le token OTP de session peut être utilisé avec une application de paiement.
Dans les sessions d'utilisateurs distants (et les sessions autonomes à des fins de test), le token renvoyé peut être utilisé par 4D pour identifier les requêtes provenant du web qui partagent la session.
Pour plus d'informations sur les tokens OTP, veuillez consulter cette section.
Si un token expiré est utilisé pour restaurer la session, il est ignoré.
Exemple
var $token : Text
$token := Session.createOTP( 60 ) //le token est valable pendant 1 mn
.demote()
Historique
| Release | Modifications |
|---|---|
| 20 R10 | Ajout |
.demote( promoteId : Integer )
| Paramètres | Type | Description | |
|---|---|---|---|
| promoteId | Integer | -> | Id retourné par la fonction promote() |
Description
La fonction .demote() supprime du process web le privilège promu dont l'identifiant a été passé dans promoteId, s'il a été précédemment ajouté par la fonction .promote().
Si aucun privilège avec promoteId n'a été promu à l'aide de .promote() dans le process web, la fonction ne fait rien.
Si plusieurs privilèges ont été ajoutés au process web, la fonction demote() doit être appelée pour chacun d'entre eux avec le promoteId approprié. Les privilèges sont empilés dans l'ordre dans lequel ils ont été ajoutés au process, il est recommandé de dépiler les privilèges dans l'ordre LIFO (Last In, First Out).
- Gardez à l'esprit que les privilèges ne s'appliquent qu'au code exécuté via les accès web, quel que soit le type de session sur lequel cette fonction est exécutée.
- Cette fonction ne peut pas être appelée côté client d'une session utilisateur distante (une erreur est renvoyée).
Exemple
exposed Function search($search : Text) : Collection
var $employees : Collection
var $promoteId1; $promoteId2 : Integer
$promoteId1:=Session.promote("admin")
$promoteId2:=Session.promote("superAdmin")
$search:="@"+$search+"@"
$employees:=This.query("type = :1 and lastname = :2"; "Intern"; $search).toCollection()
Session.demote($promoteId2)
Session.demote($promoteId1)
return $employees
Voir également
.expirationDate
Historique
| Release | Modifications |
|---|---|
| 18 R6 | Ajout |
.expirationDate : Text
Description
Cette propriété est uniquement disponible avec les sessions web.
La propriété .expirationDate contient la date et l'heure d'expiration du cookie de session. La valeur est exprimée sous forme de texte au format ISO 8601 : YYYY-MM-DDTHH:MM:SS.mmmZ.
Cette propriété est en lecture seule. Elle est automatiquement recalculée si la valeur de la propriété .idleTimeout est modifiée.
Exemple
var $expiration : Text
$expiration:=Session.expirationDate //ex : "2021-11-05T17:10:42Z"
.getPrivileges()
Historique
| Release | Modifications |
|---|---|
| 21 | Prise en charge des sessions distantes et autonomes |
| 20 R6 | Ajout |
.getPrivileges() : Collection
| Paramètres | Type | Description | |
|---|---|---|---|
| Résultat | Collection | <- | Collection de noms de privilèges (chaînes) |
Description
La fonction .getPrivileges() renvoie une collection contenant tous les noms de privilèges associés à la session.
Cette fonction renvoie les privilèges attribués à une session en utilisant la fonction setPrivileges() uniquement. Les privilèges promus ne sont PAS renvoyés par la fonction, qu'ils aient été ajoutés via le fichier roles.json ou la fonction promote().
Gardez à l'esprit que les privilèges ne s'appliquent qu'au code exécuté via les accès web, quel que soit le type de session sur lequel cette fonction est exécutée.
Exemple
Les rôles suivants roles.json ont été définis :
{
"privileges":[
{
"privilege":"simple",
"includes":[
]
},
{
"privilege":"medium",
"includes":[
"simple"
]
}
],
"roles":[
{
"role":"Medium",
"privileges":[
"medium"
]
}
],
"permissions":{
"allowed":[
]
}
}
Le rôle de la session est attribué dans une fonction de datastore authentify() :
//Datastore Class
exposed Function authentify($role : Text) : Text
Session.clearPrivileges()
Session.setPrivileges({roles: $role})
En supposant que la fonction authentify() soit appelée avec le rôle "Medium" :
var $privileges : Collection
$privileges := Session.getPrivileges()
//$privileges: ["simple","medium"]
Voir également
.setPrivileges()
Permissions – Inspect the privileges in the session for an easy debugging (article de blog)
.hasPrivilege()
Historique
| Release | Modifications |
|---|---|
| 21 | Retourne True pour les privilèges promus, Prise en charge des sessions distantes et autonomes |
| 18 R6 | Ajout |
.hasPrivilege( privilege : Text ) : Boolean
| Paramètres | Type | Description | |
|---|---|---|---|
| privilege | Text | -> | Nom du privilège à vérifier |
| Résultat | Boolean | <- | Vrai si la session dispose du privilege, sinon Faux |
Description
La fonction .hasPrivilege() renvoie True si le privilege est associé à la session, et False sinon.
Cette fonction renvoie True pour le privilège si elle est appelée depuis une fonction qui a été promue pour ce privilège (soit via le fichier roles.json, soit via la fonction promote()).
Gardez à l'esprit que les privilèges ne s'appliquent qu'au code exécuté via les accès web, quel que soit le type de session sur lequel cette fonction est exécutée.
Exemple
Vous voulez vérifier si le privilège "CreateInvoices" est associé à la session de l'utilisateur web :
If (Session.hasPrivilege("CreateInvoices"))
//Accès à la fonctionnalité de création de facture
Else
//Pas d'accès à la fonctionnalité
End if
Voir également
.id
Historique
| Release | Modifications |
|---|---|
| 20 R5 | Ajout |
.id : Text
Description
La propriété .id contient l'identifiant unique (UUID) de la session utilisateur.
Avec 4D Server, cette chaîne unique est automatiquement assignée par le serveur à chaque session et vous permet d'identifier ses process. Elle est disponible dans l'objet Session à la fois côté serveur et côté client.
Vous pouvez utiliser cette propriété pour obtenir l'objet .storage d'une session grâce à la commande Session storage.
.idleTimeout
Historique
| Release | Modifications |
|---|---|
| 18 R6 | Ajout |
.idleTimeout : Integer
Description
Cette propriété est uniquement disponible avec les sessions web.
La propriété .idleTimeout contient le délai maximal d'inactivité de session (en minutes), au-delà duquel la session est automatiquement fermée par 4D.
Si cette propriété n'est pas définie, sa valeur par défaut est 60 (1h).
Lorsque cette propriété est définie, la propriété .expirationDate est mise à jour en conséquence.
La valeur ne peut pas être < 60 ; si une valeur inférieure est définie, le timeout est élevé à 60.
Cette propriété est en lecture-écriture.
Exemple
If (Session.isGuest())
// La session Guest se ferme après 60 minutes d'inactivité
Session.idleTimeout:=60
Else
// Les autres sessions se ferment après 120 minutes d'inactivité
Session.idleTimeout:=120
End if
.info
Historique
| Release | Modifications |
|---|---|
| 20 R5 | Ajout |
.info : Object
Description
La propriété .info décrit la session.
- Sessions utilisateurs distants et Sessions de procédures stockées : L'objet
.infoest le même que celui renvoyé dans la propriété "session" par la commandeProcess activity. - Sessions autonomes : L'objet
.infoest le même que celui retourné par la commandeSession info. - Sessions utilisateur Web: L'objet
.infocontient les propriétés disponibles pour les sessions utilisateur web.
L'objet .info contient les propriétés suivantes:
| Propriété | Type | Description |
|---|---|---|
| type | Text | Type de session : "remote", "storedProcedure", "standalone", "rest", "web" |
| userName | Text | Nom d'utilisateur 4D (même valeur que .userName) |
| machineName | Text |
|
| systemUserName | Text |
|
| IPAddress | Text |
|
| hostType | Text | Type d'hôte : "windows", "mac" ou "browser" |
| creationDateTime | Date ISO 8601 | Date et heure de la création de la session (session autonome : date et heure du démarrage de l'application) |
| state | Text | État de la session : "active", "postponed", "sleeping" |
| ID | Text | UUID de session (même valeur que .id) |
| persistentID | Text | Sessions distantes server/clients : ID persistant de la session |
.info étant une propriété calculée, il est recommandé de l'appeler une fois et de la stocker dans une variable locale si vous souhaitez effectuer un traitement sur ses propriétés.
.isGuest()
Historique
| Release | Modifications |
|---|---|
| 18 R6 | Ajout |
.isGuest() : Boolean
| Paramètres | Type | Description | |
|---|---|---|---|
| Résultat | Boolean | <- | True si la session est une session Guest, False sinon (sessions web uniquement) |
Description
Cette fonction renvoie toujours False pour les sessions non web.
La fonction .isGuest() retourne True tant que setPrivileges() n'est pas appelé dans la session ou après qu'un Qodly logout a été exécuté dans la session.
Lorsque le mode forcelogin est désactivé, .isGuest() renvoie True lorsque la session n'a pas de privilèges.
Exemple
Dans la méthode base On Web Connection :
If (Session.isGuest())
//Faire quelque chose pour l'utilisateur invité
End if
.promote()
Historique
| Release | Modifications |
|---|---|
| 20 R10 | Ajout |
.promote( privilege : Text ) : Integer
| Paramètres | Type | Description | |
|---|---|---|---|
| privilege | Text | -> | Nom de privilège |
| Résultat | Integer | <- | id à utiliser pour l'appel de la fonction demote() |
Description
La fonction .promote() ajoute le privilège défini dans le paramètre privilege au process courant durant l'exécution de la fonction appelante et renvoie l'identifiant du privilège promu.
L'ajout dynamique de privilèges est utile lorsque les droits d'accès dépendent du contexte d'exécution, qui ne peut pas être entièrement défini dans le fichier "roles.json". Ceci est particulièrement le cas lorsque la même fonction peut être exécutée par des utilisateurs ayant des niveaux d'accès différents. L'utilisation de .promote() permet de s'assurer que seul le process en cours bénéficie des privilèges nécessaires, sans affecter les autres.
La fonction ne fait rien et renvoie 0 si :
- le privilege n'existe pas dans le fichier
roles.json, - le privilege est déjà assigné au process courant (en utilisant
.promote()ou à travers une action de promotion statique déclarée pour la fonction appelante dans le fichierroles.json).
Vous pouvez appeler la fonction promote() plusieurs fois dans le même process pour ajouter différents privilèges.
L'identifiant renvoyé est incrémenté chaque fois qu'un privilège est ajouté dynamiquement au process.
Pour supprimer un privilège de manière dynamique, appelez la fonction demote() avec l'identifiant du privilège.
- Gardez à l'esprit que les privilèges ne s'appliquent qu'au code exécuté via les accès web, quel que soit le type de session sur lequel cette fonction est exécutée.
- Cette fonction ne peut pas être appelée côté client d'une session utilisateur distante (une erreur est renvoyée).
Exemple
Plusieurs utilisateurs se connectent à un seul point d'accès qui sert différentes applications. Un utilisateur de l'application n°1 n'a pas besoin du privilège "super_admin" car il ne crée pas de "VerySensitiveInfo". Un utilisateur de l'application n° 2 a besoin du privilège "super_admin".
Vous pouvez allouer dynamiquement les privilèges appropriés dans la fonction CreateInfo :
exposed Function createInfo($info1 : Text; $info2 : Text)
var $sensitive : cs.SensitiveInfoEntity
var $verySensitiveInfo : cs.VerySensitiveInfoEntity
var $status : Object
var $promoteId : Integer
$sensitive:=ds.SensitiveInfo.new()
$sensitive.info:=$info1
$status:=$sensitive.save()
If (Session.storage.role.name="userApp2")
$promoteId:=Session.promote("super_admin")
$verySensitiveInfo:=ds.VerySensitiveInfo.new()
$verySensitiveInfo.info:=$info2
$status:=$verySensitiveInfo.save()
Session.demote($promoteId)
End if
Voir également
.restore()
Historique
| Release | Modifications |
|---|---|
| 20 R9 | Ajout |
.restore ( token : Text ) : Boolean
| Paramètres | Type | Description | |
|---|---|---|---|
| token | Text | -> | UUID du token de session |
| Résultat | Boolean | <- | True si la session courante a été remplacée avec succès par la session du token |
Description
La fonction .restore() remplace la session courante de l'utilisateur Web par sa session originale correspondant à l'UUID token. Le storage et les privilèges de la session sont restaurés.
Si la session originale de l'utilisateur a été correctement restaurée, la fonction renvoie true.
La fonction renvoie false si :
- le token de session a déjà été utilisé,
- le token de session a expiré,
- le token de session n'existe pas,
- la session d'origine elle-même a expiré.
Dans ce cas, la session courante de l'utilisateur web est laissée intacte (aucune session n'est restaurée).
- Gardez à l'esprit que les privilèges ne s'appliquent qu'au code exécuté via les accès web, quel que soit le type de session sur lequel cette fonction est exécutée.
- Cette fonction ne peut pas être appelée côté client d'une session utilisateur distante (une erreur est renvoyée).
Exemple
Dans un singleton appelé par un HTTP request handler personnalisé :
shared singleton Class constructor()
Function callback($request : 4D.IncomingMessage) : 4D.OutgoingMessage
Session.restore($request.urlQuery.state)
Voir également
.setPrivileges()
Historique
| Release | Modifications |
|---|---|
| 21 | Prise en charge des sessions distantes et autonomes |
| 19 R8 | Prise en charge de la propriété "roles" dans settings |
| 18 R6 | Ajout |
.setPrivileges( privilege : Text ) : Boolean
.setPrivileges( privileges : Collection )
.setPrivileges( settings : Object ) : Boolean
| Paramètres | Type | Description | |
|---|---|---|---|
| privilege | Text | -> | Nom de privilège |
| privileges | Collection | -> | Collection de noms de privilèges |
| settings | Object | -> | Objet contenant une propriété "privileges" (texte ou collection) |
| Résultat | Boolean | <- | True si l'exécution est réussie |
Description
La fonction .setPrivileges() associe le ou les privilège(s) et/ou rôle(s) défini(s) en paramètre à la session et renvoie True si l'exécution a réussi.
- Dans le paramètre privilege, passez une chaîne contenant un nom de privilège (ou plusieurs noms de privilèges séparés par des virgules).
- Dans le paramètre privileges, passez une collection de chaînes contenant des noms de privilèges.
- Dans le paramètre settings, passez un objet contenant les propriétés suivantes :
| Propriété | Type | Description |
|---|---|---|
| privileges | Text ou Collection | |
| roles | Text ou Collection | |
| userName | Text | Nom d'utilisateur à associer à la session (facultatif, uniquement pour les sessions web). Non disponible dans les sessions de clients distants (ignoré). |
Les privilèges et les rôles sont définis dans le fichier roles.json du projet. Pour plus d'informations, veuillez vous reporter à la section Privileges.
Si la propriété privileges ou roles contient un nom qui n'est pas déclaré dans le fichier roles.json, il est ignoré.
Par défaut lorsqu'aucun privilège ou rôle n'est associé à la session, la session est une session Guest.
La propriété userName est accessible au niveau de l'objet session (lecture seulement).
- Gardez à l'esprit que les privilèges ne s'appliquent qu'au code exécuté via les accès web, quel que soit le type de session sur lequel cette fonction est exécutée.
- Cette fonction ne peut pas être appelée côté client d'une session utilisateur distante (une erreur est renvoyée).
Exemple
Dans une méthode d'authentification personnalisée, vous assignez le privilège "WebAdmin" à l'utilisateur :
var $userOK : Boolean
... //Authentifier l'utilisateur
If ($userOK) //L'utilisateur a été approuvé
var $info : Object
$info:=New object()
$info.privileges:=New collection("WebAdmin")
Session.setPrivileges($info)
End if
Voir également
.storage
Historique
| Release | Modifications |
|---|---|
| 20 R5 | Prise en charge des sessions desktop |
| 18 R6 | Ajout |
.storage : Object
Description
La propriété .storage contient un objet partagé qui peut être utilisé pour stocker des informations disponibles pour tous les process de la session.
Lorsqu'un objet Session est créé, la propriété .storage est vide. Cette propriété est elle-même en lecture seulement mais elle retourne un objet en lecture-écriture.
- Puisqu'il s'agit d'un objet partagé, cette propriété sera disponible dans l'objet
Storagede la machine (serveur ou client). - Comme l'objet
Storagede la machine, la propriété.storageest toujours "single" : l'ajout d'un objet partagé ou d'une collection partagée à.storagene crée pas de groupe partagé.
En client/serveur, l'objet .storage de la session de l'utilisateur distant n'est pas le même sur le serveur et sur le client.
Lorsqu'une session utilisateur distante et une session web sont partagées à l'aide d'un OTP, elles partagent également le même objet .storage sur le serveur, même si l'OTP a été créé à partir de la session du côté client.
Vous pouvez obtenir la propriété .storage d'une session en utilisant la commande Session storage.
Exemple de session Web
Vous voulez stocker l'adresse IP du client dans la propriété .storage. Vous pouvez écrire dans la méthode base On Web Authentication :
If (Session.storage.clientIP=Null) //first access
Use (Session.storage)
Session.storage.clientIP:=New shared object("value"; $clientIP)
End use
End if
Exemple de session distante
Vous voulez partager des données entre les process de la même session :
Use (Session.storage)
Session.storage.settings:=New shared object("property"; $value; "property2"; $value2)
End use
.userName
Historique
| Release | Modifications |
|---|---|
| 20 R5 | Prise en charge des sessions desktop |
| 18 R6 | Ajout |
.userName : Text
Description
La propriété .userName contient le nom d'utilisateur associé à la session. Vous pouvez vous en servir pour identifier l'utilisateur dans votre code.
- Sessions web : Cette propriété est une chaîne vide par défaut. Elle peut être définie via la propriété
privilegesde la fonctionsetPrivileges(). - Sessions de procédure stockée/distantes : Cette propriété retourne le même nom d'utilisateur que la commande
Current user. - Sessions autonomes : Cette propriété contient "designer" ou le nom défini avec la commande
SET USER ALIAS.
Cette propriété est en lecture seule pour les sessions desktop.