Sessions Desktop
Une session desktop est un contexte d'exécution lié à l'utilisateur sur 4D Server ou 4D mono-utilisateur qui ne résulte pas d'un accès web ou REST.
Tout comme dans une session utilisateur web, le code exécuté dans une session desktop a accès à un objet Session qui fournit des fonctions et des propriétés permettant de stocker les valeurs de session et de les partager entre les process utilisateur, par exemple en utilisant l'objet session.storage.
Toutefois, à la différence du code exécuté dans les sessions utilisateurs Web, le code exécuté dans les sessions desktop n'est pas soumis aux règles des rôles et privilèges. Il peut accéder à toutes les parties de l'application 4D, y compris ORDA et les classes du modèle de données. Sur 4D Server, la fonctionnalité des utilisateurs et groupes permet de gérer les accès des utilisateurs.
Vous pouvez néanmoins partager une session desktop avec une session web afin qu'un utilisateur desktop puisse accéder à votre application 4D par le biais d'une interface web, en utilisant par exemple des pages Qodly et des zones web.
Types de sessions
Les sessions desktop comprennent :
- les Sessions utilisateur distant : Dans les applications client/serveur, la session qui gère les process utilisateur sur le serveur.
- les Sessions des procédures stockées : Dans les applications client/serveur, la session utilisateur virtuelle unique qui gère toutes les procédures stockées exécutées sur le serveur.
- les Sessions autonomes: Objet de session locale retourné dans une application mono-utilisateur (utile dans les phases de développement et de test des applications client/serveur).
N'oubliez pas que des Sessions Web sont utilisées dès qu'on accède au projet 4D via des requêtes Web ou REST et que les sessions évolutives sont activées.
Le diagramme suivant montre les différents types de sessions et leur interaction :

Sessions utilisateur distant
Sur le serveur, dans les "process utilisateur" (c'est-à-dire les process liés aux utilisateurs distants), la commande Session renvoie un objet session décrivant la session de l'utilisateur courant. Cet objet est géré via les fonctions et les propriétés de la classe Session.
Sur un 4D distant, l'objet session renvoie toujours null.
Utilisation
L'objet session vous permet de gérer les informations et les privilèges de la session de l'utilisateur distant.
Vous pouvez partager des données entre tous les process de la session utilisateur en utilisant l'objet partagé session.storage. Par exemple, vous pouvez lancer une procédure d'authentification et de vérification de l'utilisateur lorsqu'un client se connecte au serveur, impliquant la saisie d'un code envoyé par e-mail ou SMS dans l'application. Ensuite, vous ajoutez les informations de l'utilisateur au storage de session, ce qui permet au serveur d'identifier l'utilisateur. De cette façon, le serveur 4D peut accéder aux informations de l'utilisateur pour tous les process clients, permettant l'écriture de code personnalisé en fonction du rôle de l'utilisateur.
Vous pouvez également attribuer des privilèges à une session d'utilisateur distant pour contrôler l'accès lorsque la session provient de pages Qodly exécutées dans des zones Web.
Disponibilité
L'objet session de l'utilisateur distant est disponible depuis :
- Les méthodes projet qui ont l'attribut Exécuter sur serveur (elles sont exécutées dans le process jumeau du process client),
- Les Triggers,
- Les fonctions ORDA du modèle de données (sauf celles déclarées avec le mot-clé
local), - Les méthodes base telles que
On Server Open ConnectionetOn Server Close Connection.
Session des procédures stockées
Sur le serveur, toutes les [procédures stockées] (https://doc.4d.com/4Dv20/4D/20/Stored-Procedures.300-6330553.en.html) partagent la même session utilisateur virtuelle.
Utilisation
Vous pouvez partager des données entre tous les process d'une session de procédures stockées à l'aide de l'objet partagé session.storage.
Disponibilité
L'objet session des procédures stockées est disponible depuis :
- les méthodes projet appelées par la commande
Execute on Server, - les fonctions ORDA du modèle de données appelées à partir d'une procédure stockée,
- les méthodes base telles que
On Server StartupetOn Server Shutdown.
Sessions autonomes
Une session autonome est une session mono-utilisateur qui s'exécute lorsque vous travaillez localement avec 4D.
Utilisation
La session autonome peut être utilisée pour développer et tester votre application client/serveur et son interaction avec les sessions web et le partage d'OTP. Vous pouvez utiliser l'objet session dans votre code d'une session autonome tout comme l'objet session des sessions distantes.
Disponibilité
L'objet session d'une application autonome est disponible pour toutes les méthodes et le code exécutés sur l'application 4D.
Partage d'une session desktop pour les accès web
Les sessions desktop peuvent être utilisées pour gérer les accès web d'un même utilisateur à l'application et ainsi contrôler ses privilèges. Cette possibilité est particulièrement utile pour les applications Client/serveur dans lesquelles des pages Qodly sont utilisées pour l'interface, sur des machines clientes distantes. Avec cette configuration, vos applications disposent d'interfaces web modernes basées sur les CSS, tout en bénéficiant de la puissance et de la simplicité du développement intégré client/serveur. Dans ces applications, les pages Qodly sont exécutées dans des zones Web 4D standard.
Pour gérer cette configuration en production, vous devez utiliser des sessions utilisateur distant. En fait, les requêtes provenant à la fois de l'application 4D distante et de ses pages Qodly chargées dans les zones Web doivent fonctionner au sein de la même session. Il suffit de partager la session entre le client distant et ses pages web afin de disposer du même session storage et de la même licence client, quelle que soit l'origine de la requête (web ou 4D distant).
Notez que les privileges doivent être définis dans la session avant d'exécuter une requête web, afin que l'utilisateur obtienne automatiquement ses privilèges pour l'accès au web (voir l'exemple). N'oubliez pas que les privilèges ne s'appliquent qu'aux requêtes provenant du web.
Vous pouvez développer cette configuration dans votre application 4D Developer (mono-utilisateur) : vous pouvez utiliser la session autonome pour coder et tester toutes les fonctionnalités liées à l'accès web, que votre application soit destinée à un déploiement mono-utilisateur ou client/serveur.
Les sessions partagées sont gérées par des tokens OTP. Après avoir créé un token OTP pour la session desktop sur le serveur ou sur l'application 4D mono-utilisateur, vous ajoutez le jeton (par le biais de la valeur du paramètre $4DSID) aux requêtes Web envoyées à partir des zones Web contenant des pages Qodly (ou à partir de n'importe quel navigateur Web) afin que la session de l'utilisateur sur le serveur ou l'application mono-utilisateur soit identifiée et partagée. Du côté du serveur web, si une requête web contient un id OTP dans le paramètre $4DSID, la session correspondant à ce token OTP est utilisée.
Lors de la création d'un token OTP en environnement client/serveur, vous devez exécuter le code de création de l'OTP sur le serveur (l'objet Session est Null sur un 4D distant). Vous pouvez par exemple utiliser la méthode base On Server Open Connection.
Exemple
Dans un formulaire, obtenez un OTP et ouvrez une page Qodly dans une zone Web :
Form.otp:=getOTP
Form.url:="http://localhost/$lib/renderer/?w=Products&$4DSID="+Form.otp
WA OPEN URL(*; "QodlyPage"; Form.url)
La méthode de projet getOTP (avec la propriété Exécuter sur le serveur en Client/Server) :
// En client/serveur:
// ----------------
// Méthode exécutée sur le serveur car l'objet session est sur le serveur
// L'objet Session est Null sur le client
//
#DECLARE() : Text
return Session.createOTP()
Voici le code utilisé pour placer le privilège "viewProducts" dans la session :
// En client/serveur:
// ----------------
// Ce code doit être exécuté sur le serveur car l'objet session est sur le serveur
// L'objet Session est Null sur la session client
Session.clearPrivileges() // Nettoie la session de ses anciens privilèges
Session.setPrivileges("viewProducts")