Saltar al contenido principal
Versión: 20 R6 BETA

Session

Los objetos de sesión son devueltos por el comando Session. Estos objetos ofrecen al desarrollador una interfaz que permite gestionar la sesión de usuario actual y ejecutar acciones como almacenar datos contextuales, compartir información entre procesos de sesión, lanzar procesos preferentes relacionados con la sesión o (sólo web) gestionar privilegios.

Tipos de sesiones

Esta clase admite tres tipos de sesiones:

nota

La disponibilidad de las propiedades y funciones del objeto Session depende del tipo de sesión.

Resumen

.clearPrivileges() : Boolean
elimina todos los privilegios asociados a la sesión y devuelve True si la ejecución se ha realizado correctamente
.expirationDate : Text
la fecha y hora de expiración de la cookie de sesión
.getPrivileges() : Collection
devuelve una colección de todos los nombres de privilegios asociados a la sesión
.hasPrivilege( privilege : Text ) : Boolean
devuelve True si privilege está asociado a la sesión, y False en caso contrario
.id : Text
el identificador único (UUID) de la sesión en el servidor
.idleTimeout : Integer
el tiempo de inactividad de la sesión (en minutos), después del cual la sesión es cerrada automáticamente por 4D
.info : Object
describe la sesión del cliente remoto o del procedimiento almacenado en el servidor
.isGuest() : Boolean
devuelve True si la sesión es una sesión Guest (es decir, no tiene privilegios)
.setPrivileges( privilege : Text ) : Boolean
.setPrivileges( privileges : Collection )
.setPrivileges( settings : Object ) : Boolean

asocia a la sesión los privilegios y/o roles definidos en el parámetro y devuelve True si la ejecución se ha realizado correctamente
.storage : Object
un objeto compartido que puede utilizarse para almacenar información disponible para todos los procesos de la sesión
.userName : Text
el nombre de usuario asociado a la sesión

Session

Historia
LanzamientoModificaciones
20 R5Soporte de cliente remoto y sesiones de procedimientos almacenados
18 R6Añadidos

Session : 4D.Session

ParámetrosTipoDescripción
Result4D.Session<-Objeto Session

Descripción

El comando Session devuelve el objeto Session correspondiente a la sesión usuario actual.

Dependiendo del proceso desde el que se llame al comando, la sesión de usuario actual puede ser:

Para más información, consulte el párrafo Tipos de sesión.

Si el comando se llama desde un contexto no soportado (aplicación monousuario, sesiones escalables desactivadas...), devuelve Null.

Sesiones web

El objeto Session de las sesiones web está disponible desde cualquier proceso web:

  • Métodos base On Web Authentication, On Web Connection y On REST Authentication,
  • código procesado a través de las etiquetas 4D en las páginas semidinámicas (4DTEXT, 4DHTML, 4DEVAL, 4DSCRIPT/, 4DCODE)
  • los métodos proyecto con el atributo "Available through 4D tags and URLs (4DACTION...)" y llamados a través de 4DACTION/ urls,
  • métodos base On Mobile App Authentication y On Mobile App Action para peticiones móviles,
  • Funciones ORDA llamadas con peticiones REST.

Para más información sobre las sesiones usuario web, consulte la sección Sesiones web.

Sesiones de cliente remoto

El objeto Session de las sesiones cliente remotas está disponible desde:

  • Métodos proyecto que tienen el atributo Ejecutar en el Servidor (se ejecutan en el proceso "twinned" del proceso cliente),
  • Triggers,
  • Los métodos base On Server Open Connection y On Server Shutdown Connection de la base de datos.

Para más información sobre las sesiones usuario remoto, por favor consulte el párrafo Sesiones usuario cliente remoto.

Sesión de procedimientos almacenados

Todos los procesos de procedimientos almacenados comparten la misma sesión virtual de usuario. El objeto Session de los procedimientos almacenados está disponible desde:

  • métodos llamados con el comando Execute on server,
  • Los métodos base On Server Startup, On Server Shutdown, On Backup Startup, On Backup Shutdown y On System event

Para obtener información sobre la sesión de usuario virtual de los procedimientos almacenados, consulte la página 4D Server y lenguaje 4D.

Ejemplo

Ha definido el método action_Session con el atributo "Disponible a través de etiquetas 4D y URLs". Se llama al método introduciendo la siguiente URL en el navegador:

IP:port/4DACTION/action_Session
  //método action_Session
Case of
:(Session#Null)
If(Session.hasPrivilege("WebAdmin")) //llamando a la función hasPrivilege
WEB SEND TEXT("4DACTION --> Session is WebAdmin")
Else
WEB SEND TEXT("4DACTION --> Session is not WebAdmin")
End if
Else
WEB SEND TEXT("4DACTION --> Session is null")
End case

Ver también

Session storage by ID

.clearPrivileges()

Historia
LanzamientoModificaciones
18 R6Añadidos

.clearPrivileges() : Boolean

ParámetrosTipoDescripción
ResultBoolean<-True si la ejecución se ha realizado correctamente

Descripción

nota

Esta función no hace nada y siempre devuelve False con las sesiones de clientes remotos y de los procedimientos almacenados.

La función .clearPrivileges() elimina todos los privilegios asociados a la sesión y devuelve True si la ejecución se ha realizado correctamente. Como resultado, la sesión se convierte automáticamente en una sesión de invitado.

Ejemplo

//Invalidar una sesión usuario web
var $isGuest : Boolean
var $isOK : Boolean

$isOK:=Session.clearPrivileges()
$isGuest:=Session.isGuest() //$isGuest es True

.expirationDate

Historia
LanzamientoModificaciones
18 R6Añadidos

.expirationDate : Text

Descripción

nota

Esta propiedad sólo está disponible con sesiones de usuario web.

La propiedad .expirationDate contiene la fecha y hora de expiración de la cookie de sesión. El valor se expresa como texto en el formato ISO 8601: YYYY-MM-DDTHH:MM:SS.mmmZ.

Esta propiedad es de solo lectura. Se recalcula automáticamente si se modifica el valor de la propiedad .idleTimeout.

Ejemplo

var $expiration : Text
$expiration:=Session.expirationDate //eg "2021-11-05T17:10:42Z"

.getPrivileges()

Historia
LanzamientoModificaciones
20 R6Añadidos

.getPrivileges() : Collection

ParámetrosTipoDescripción
ResultCollection<-Colección de nombres de privilegios (cadenas)

Descripción

La función .getPrivileges() devuelve una colección de todos los nombres de privilegios asociados a la sesión.

Con sesiones de cliente remoto y procedimiento almacenado, esta función devuelve una colección que sólo contiene "WebAdmin".

info

Los privilegios se asignan a una Sesión utilizando la función setPrivileges().

Ejemplo

Se ha definido el siguiente archivo roles.json:

{
"privileges":[
{
"privilege":"simple",
"includes":[

]
},
{
"privilege":"medium",
"includes":[
"simple"
]
}
],
"roles":[
{
"role":"Medium",
"privileges":[
"medium"
]
}
],
"permissions":{
"allowed":[

]
}
}

El rol de sesión se asigna en una función datastore authentify():

  //Clase Datastore

exposed Function authentify($role : Text) : Text
Session.clearPrivileges()
Session.setPrivileges({roles: $role})

Asumiendo que la función authentify() es llamada con el rol "Medium":

var $privileges : Collection
$privileges := Session.getPrivileges()
//$privileges: ["simple","medium"]

Ver también

.setPrivileges()
Permissions – Inspect the privileges in the session for an easy debugging (blog post)

.hasPrivilege()

Historia
LanzamientoModificaciones
18 R6Añadidos

.hasPrivilege( privilege : Text ) : Boolean

ParámetrosTipoDescripción
privilegeText->Nombre del privilegio a verificar
ResultBoolean<-True si la sesión tiene privilege, False en caso contrario

Descripción

La función .hasPrivilege() devuelve True si privilege está asociado a la sesión, y False en caso contrario.

Con sesiones de cliente remoto y de procedimientos almacenados, esta función siempre devuelve True, sea cual sea el privilege.

Ejemplo

Quiere comprobar si el privilegio "WebAdmin" está asociado a la sesión usuario web:

If (Session.hasPrivilege("WebAdmin"))
//Acceso concedido, no hacer nada
Else
//Mostrar una página de autenticación

End if

.id

Historia
LanzamientoModificaciones
20 R5Añadidos

.id : Text

Descripción

La propiedad .id contiene el identificador único (UUID) de la sesión en el servidor. Esta cadena única es asignada automáticamente por el servidor para cada sesión y permite identificar sus procesos.

tip

Puede utilizar esta propiedad para obtener el objeto .storage de una sesión gracias al comando Session storage by ID.

.idleTimeout

Historia
LanzamientoModificaciones

|18 R6|Añadido|

.idleTimeout : Integer

Descripción

nota

Esta propiedad sólo está disponible con sesiones de usuario web.

La propiedad .idleTimeout contiene el tiempo de inactividad de la sesión (en minutos), después del cual la sesión es cerrada automáticamente por 4D.

Si no se define esta propiedad, el valor por defecto es 60 (1h).

Cuando se define esta propiedad, la propiedad expirationDate se actualiza en consecuencia.

El valor no puede ser inferior a 60: si se define un valor inferior, el tiempo de espera se eleva hasta 60.

Esta propiedad está en lectura escritura.

Ejemplo

If (Session.isGuest())
// Una sesión de invitado se cerrará tras 60 minutos de inactividad
Session.idleTimeout:=60
Else
// Otras sesiones se cerrarán tras 120 minutos de inactividad
Session.idleTimeout:=120
End if

.info

Historia
LanzamientoModificaciones
20 R5Añadidos

.info : Object

Descripción

nota

Esta propiedad sólo está disponible con sesiones de cliente remoto y procedimientos almacenados.

La propiedad .info describe la sesión del cliente remoto o del procedimiento almacenado en el servidor.

El objeto .info es el mismo objeto que el devuelto por el comando Get process activity para sesiones cliente remotas y procedimientos almacenados.

El objeto .info contiene las siguientes propiedades:

PropiedadTipoDescripción
typeTextTipo de sesión: "remote" o "storedProcedure"
userNameTextNombre de usuario 4D (mismo valor que .userName)
machineNameTextSesiones remotas: nombre de la máquina remota. Sesión de procedimientos almacenados: nombre del equipo servidor
systemUserNameTextSesiones remotas: nombre de la sesión del sistema abierta en la máquina remota.
IPAddressTextDirección IP de la máquina remota
hostTypeTextTipo de host: "windows" o "mac"
creationDateTimeDate ISO 8601Fecha y hora de creación de la sesión
stateTextEstado de la sesión: "active", "postponed", "sleeping"
IDTextUUID de sesión (el mismo valor que .id)
persistentIDTextID persistente de la sesión
nota

Dado que .info es una propiedad calculada, se recomienda llamarla una vez y luego almacenarla en una variable local si se desea realizar algún procesamiento sobre sus propiedades.

.isGuest()

Historia
LanzamientoModificaciones
18 R6Añadidos

.isGuest() : Boolean

ParámetrosTipoDescripción
ResultBoolean<-True si la sesión es una sesión Guest, False en caso contrario

Descripción

nota

Esta función siempre devuelve False con sesiones de cliente remoto y procedimientos almacenados.

La función .isGuest() devuelve True si la sesión es una sesión Guest (es decir, no tiene privilegios).

Ejemplo

En el método base On Web Connection:

If (Session.isGuest())
//Hacer algo para el usuario invitado
End if

.setPrivileges()

Historia
LanzamientoModificaciones
19 R8Compatibilidad con la propiedad "roles" en Settings
18 R6Añadidos

.setPrivileges( privilege : Text ) : Boolean
.setPrivileges( privileges : Collection )
.setPrivileges( settings : Object ) : Boolean

ParámetrosTipoDescripción
privilegeText->Nombre del privilegio
privilegesCollection->Colección de nombres de privilegios
settingsObject->Objeto con una propiedad "privilegios" (cadena o colección)
ResultBoolean<-True si la ejecución se ha realizado correctamente

Descripción

nota

Esta función no hace nada y siempre devuelve False con las sesiones de clientes remotos y de los procedimientos almacenados.

La función .setPrivileges() asocia a la sesión los privilegios y/o roles definidos en el parámetro y devuelve True si la ejecución se ha realizado correctamente.

  • En el parámetro privilege, pase una cadena que contenga un nombre de privilegio (o varios nombres de privilegio separados por comas).

  • En el parámetro privileges, pase una colección de cadenas que contengan nombres de privilegios.

  • En el parámetro settings, pase un objeto que contenga las siguientes propiedades:

PropiedadTipoDescripción
privilegesText o Collection
  • Cadena que contiene un nombre de privilegio, o
  • Colección de cadenas que contienen nombres de privilegios
  • rolesText o Collection
  • Cadena que contiene un rol, o
  • Colección de cadenas que contienen roles
  • userNameTextNombre de usuario para asociar a la sesión (opcional)
    nota

    Los privilegios y los roles se definen en el archivo roles.json del proyecto. Para más información, consulte la sección Privilegios.

    Si la propiedad privileges o roles contiene un nombre que no está declarado en el archivo roles.json, se ignora.

    Por defecto, cuando no hay ningún privilegio o rol asociado a la sesión, la sesión es una sesión de invitado.

    La propiedad userName está disponible a nivel de objeto de sesión (sólo lectura).

    Ejemplo

    En un método de autenticación personalizado, se establece el privilegio "WebAdmin" para el usuario:

    var $userOK : Boolean

    ... //Autenticar al usuario

    If ($userOK) //El usuario ha sido aprobado
    var $info : Object
    $info:=New object()
    $info.privileges:=New collection("WebAdmin")
    Session.setPrivileges($info)
    End if

    Ver también

    .getPrivileges()

    .storage

    Historia
    LanzamientoModificaciones
    20 R5Soporte de cliente remoto y sesiones de procedimientos almacenados
    18 R6Añadidos

    .storage : Object

    Descripción

    La propiedad .storage contiene un objeto compartido que puede utilizarse para almacenar información disponible para todos los procesos de la sesión.

    Cuando se crea un objeto Session, la propiedad .storage está vacía. Al ser un objeto compartido, esta propiedad estará disponible en el objeto Storage del servidor.

    Al igual que el objeto Storage del servidor, la propiedad .storage es siempre "single": añadir un objeto compartido o una colección compartida a .storage no crea un grupo compartido.

    Esta propiedad es sólo lectura en sí misma pero devuelve un objeto de lectura-escritura.

    tip

    Puede obtener la propiedad .storage de una sesión utilizando el comando Session storage by ID.

    Web session example

    Desea almacenar la IP del cliente en la propiedad .storage. Puede escribir en el método 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

    Remote session example

    Desea compartir datos entre procesos de la misma sesión:

    Use (Session.storage)
    Session.storage.settings:=New shared object("property"; $value; "property2"; $value2)
    End use

    .userName

    Historia
    LanzamientoModificaciones
    20 R5Soporte de cliente remoto y sesiones de procedimientos almacenados
    18 R6Añadidos

    .userName : Text

    Descripción

    La propiedad .userName contiene el nombre de usuario asociado a la sesión. Puede utilizarlo para identificar al usuario dentro de su código.

    • Con las sesiones web, esta propiedad es una cadena vacía por defecto. Puede definirse mediante la propiedad privileges de la función setPrivileges().
    • Con sesiones remotas y de procedimientos almacenados, esta propiedad devuelve el mismo nombre de usuario que el comando Current userl.

    Esta propiedad es solo lectura.