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
Los siguientes tipos de sesiones están soportados por esta clase:
- Sesiones usuario web: las sesiones usuario web están disponibles cuando las sesiones escalables están activas en su proyecto. Se utilizan para conexiones Web y REST, y se les pueden asignar privilegios.
- Sesiones usuario cliente remoto**: en las aplicaciones cliente/servidor, los usuarios remotos tienen sus propias sesiones gestionadas en el servidor.
- Sesión de procedimientos almacenados: todos los procedimientos almacenados ejecutados en el servidor comparten la misma sesión usuario virtual.
- Sesión independiente: objeto de sesión local devuelto en una aplicación de un solo usuario (útil en las fases de desarrollo y prueba de aplicaciones cliente/servidor).
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 |
.createOTP ( { lifespan : Integer } ) : Text crea un nuevo OTP (One Time Passcode) para la sesión y devuelve su token UUID |
.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 de usuario |
.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, o la sesión autónoma |
.isGuest() : Boolean devuelve True si la sesión es una sesión Guest (es decir, no tiene privilegios) |
.restore ( token : Text ) : Boolean sustituye la sesión actual del usuario web por su sesión original correspondiente al token UUID |
.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 |
.clearPrivileges()
Historia
Lanzamiento | Modificaciones |
---|---|
18 R6 | Añadidos |
.clearPrivileges() : Boolean
Parámetros | Tipo | Descripción | |
---|---|---|---|
Resultado | Boolean | <- | True si la ejecución se ha realizado correctamente |
Descripción
Esta función no hace nada y siempre devuelve True con cliente remoto, procedimiento almacenado y sesiones independientes.
La función .clearPrivileges()
elimina todos los privilegios asociados a la sesión y devuelve True si la ejecución se ha realizado correctamente. A menos que esté en modo "forceLogin", la sesión se convierte automáticamente en una sesión de Invitado.
En modo "forceLogin", .clearPrivileges()
no transforma la sesión a una sesión de invitado, sólo elimina los privilegios de la sesión.
Ejemplo
//Invalidar una sesión usuario web
var $isGuest : Boolean
var $isOK : Boolean
$isOK:=Session.clearPrivileges()
$isGuest:=Session.isGuest() //$isGuest es True
.createOTP()
Historia
Lanzamiento | Modificaciones |
---|---|
20 R9 | Añadidos |
.createOTP ( { lifespan : Integer } ) : Text
Parámetros | Tipo | Descripción | |
---|---|---|---|
lifespan | Integer | -> | Duración de la vida del token de sesión en segundos |
Resultado | Text | <- | UUID de la sesión |
Descripción
Esta función solo está disponible con sesiones usuario web. Devuelve una cadena vacía en otros contextos.
La función .createOTP()
crea un nuevo OTP (One Time Passcode) para la sesión y devuelve su token UUID. Este token es único en la sesión en la que fue generado.
Para más información sobre los tokens OTP, por favor consulte esta sección.
Por defecto, si se omite el parámetro lifespan, el token se crea con el mismo tiempo de vida que el .idleTimeOut
de la sesión. Puede definir un tiempo de espera personalizado pasando un valor en segundos en lifespan (el valor mínimo es de 10 segundos, lifespan se restablece a 10 si se pasa un valor menor). Si se utiliza un token caducado para restaurar una sesión de usuario web, se ignora.
El token devuelto puede ser utilizado en intercambios con aplicaciones de terceros o sitios web para identificar la sesión de forma segura. Por ejemplo, el token OTP de sesión se puede utilizar con una aplicación de pago.
Ejemplo
var $token : Text
$token := Session.createOTP( 60 ) //el token es válido durante 1 mn
.expirationDate
Historia
Lanzamiento | Modificaciones |
---|---|
18 R6 | Añadidos |
.expirationDate : Text
Descripción
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
Lanzamiento | Modificaciones |
---|---|
20 R6 | Añadidos |
.getPrivileges() : Collection
Parámetros | Tipo | Descripción | |
---|---|---|---|
Resultado | Collection | <- | 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 clientes remotos, procedimientos almacenados y sesiones independientes, esta función devuelve una colección que sólo contiene "WebAdmin".
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()
Permisos - Inspeccionar los privilegios en la sesión para una fácil depuración (entrada de blog)
.hasPrivilege()
Historia
Lanzamiento | Modificaciones |
---|---|
18 R6 | Añadidos |
.hasPrivilege( privilege : Text ) : Boolean
Parámetros | Tipo | Descripción | |
---|---|---|---|
privilege | Text | -> | Nombre del privilegio a verificar |
Resultado | Boolean | <- | 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 cliente remoto, procedimientos almacenados y sesiones independientes, 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
Lanzamiento | Modificaciones |
---|---|
20 R5 | Añadidos |
.id : Text
Descripción
La propiedad .id
contiene el identificador único (UUID) de la sesión de usuario. Con 4D Server, esta cadena única es asignada automáticamente por el servidor para cada sesión y permite identificar sus procesos.
Puede utilizar esta propiedad para obtener el objeto .storage
de una sesión gracias al comando Session storage
.
.idleTimeout
Historia
Lanzamiento | Modificaciones |
---|
|18 R6|Añadido|
.idleTimeout : Integer
Descripción
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
Lanzamiento | Modificaciones |
---|---|
20 R5 | Añadidos |
.info : Object
Descripción
Esta propiedad solo está disponible con clientes remotos, procedimientos almacenados y sesiones independientes.
La propiedad .info
describe la sesión del cliente remoto o del procedimiento almacenado en el servidor, o la sesión autónoma.
- El objeto
.info
es el mismo objeto que el devuelto en la propiedad "session" por el comandoProcess activity
para sesiones de cliente remoto y procedimientos almacenados. - El objeto
.info
es el mismo que devuelve el comandoSession info
para una sesión autónoma.
El objeto .info
contiene las siguientes propiedades:
Propiedad | Tipo | Descripción |
---|---|---|
type | Text | Tipo de sesión: "remote", "storedProcedure", "standalone" |
userName | Text | Nombre de usuario 4D (mismo valor que .userName ) |
machineName | Text | Sesiones remotas: nombre de la máquina remota. Sesión de procedimientos almacenados: nombre del equipo servidor. Sesión autónoma: nombre de la máquina |
systemUserName | Text | Sesiones remotas: nombre de la sesión del sistema abierta en la máquina remota. |
IPAddress | Text | Dirección IP de la máquina remota |
hostType | Text | Tipo de host: "windows" o "mac" |
creationDateTime | Date ISO 8601 | Fecha y hora de creación de la sesión. Sesión autónoma: fecha y hora de inicio de la aplicación |
state | Text | Estado de la sesión: "active", "postponed", "sleeping" |
ID | Text | UUID de sesión (el mismo valor que .id ) |
persistentID | Text | Sesiones remotas: ID persistente de la sesión |
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
Lanzamiento | Modificaciones |
---|---|
18 R6 | Añadidos |
.isGuest() : Boolean
Parámetros | Tipo | Descripción | |
---|---|---|---|
Resultado | Boolean | <- | True si la sesión es una sesión Guest, False en caso contrario |
Descripción
Esta función siempre devuelve False con clientes remotos, procedimientos almacenados y sesiones independientes.
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
.restore()
Historia
Lanzamiento | Modificaciones |
---|---|
20 R9 | Añadidos |
.restore ( token : Text ) : Boolean
Parámetros | Tipo | Descripción | |
---|---|---|---|
token | Text | -> | UUID del token de sesión |
Resultado | Boolean | <- | True si la sesión actual ha sido reemplazada con éxito por la sesión del token |
Descripción
Esta función solo está disponible con sesiones usuario web. Devuelve False en otros contextos.
La función .restore()
sustituye la sesión actual del usuario web por su sesión original correspondiente al token UUID. El almacenamiento y los privilegios de la sesión son restaurados.
Si la sesión original del usuario ha sido correctamente restaurada, la función devuelve true
.
La función devuelve false
si:
- el token de sesión ya ha sido utilizado,
- el token de sesión ha caducado,
- el token de sesión no existe,
- la propia sesión original ha caducado.
En este caso, la sesión actual de usuario web se deja sin tocar (no se restaura la sesión).
Ejemplo
En un singleton llamado por un HTTP Request handler personalizado:
shared singleton Class constructor()
Function callback($request : 4D.IncomingMessage) : 4D.OutgoingMessage
Session.restore($request.urlQuery.state)
Ver también
.setPrivileges()
Historia
Lanzamiento | Modificaciones |
---|---|
19 R8 | Compatibilidad con la propiedad "roles" en Settings |
18 R6 | Añadidos |
.setPrivileges( privilege : Text ) : Boolean
.setPrivileges( privileges : Collection )
.setPrivileges( settings : Object ) : Boolean
Parámetros | Tipo | Descripción | |
---|---|---|---|
privilege | Text | -> | Nombre del privilegio |
privileges | Collection | -> | Colección de nombres de privilegios |
settings | Object | -> | Objeto con una propiedad "privilegios" (cadena o colección) |
Resultado | Boolean | <- | True si la ejecución se ha realizado correctamente |
Descripción
Esta función no hace nada y siempre devuelve False con cliente remoto, procedimiento almacenado y sesiones independientes.
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:
Propiedad | Tipo | Descripción |
---|---|---|
privileges | Text o Collection | |
roles | Text o Collection | |
userName | Text | Nombre de usuario para asociar a la sesión (opcional) |
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
.storage
Historia
Lanzamiento | Modificaciones |
---|---|
20 R5 | Soporte de cliente remoto y sesiones de procedimientos almacenados |
18 R6 | Añ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.
Puede obtener la propiedad .storage
de una sesión utilizando el comando Session storage
.
Ejemplo de sesión web
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
Ejemplo de sesión remota
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
Lanzamiento | Modificaciones |
---|---|
20 R5 | Soporte de cliente remoto y sesiones de procedimientos almacenados |
18 R6 | Añ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ónsetPrivileges()
. - Con sesiones remotas y de procedimientos almacenados, esta propiedad devuelve el mismo nombre de usuario que el comando
Current user
. - Con sesiones independientes, esta propiedad contiene "diseñador" o el nombre definido con el comando
SET USER ALIAS
.
Esta propiedad es solo lectura.