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 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 contexto 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. They are used for Web connections (including REST access), and are controlled by assigned privileges.
- Sesiones de escritorio, que incluyen:
- Sesiones usuario remoto**: en las aplicaciones cliente/servidor, los usuarios remotos tienen sus propias sesiones gestionadas en el servidor.
- Sesiones procedimientos almacenados**: sesión usuario virtual para todos los procedimientos almacenados ejecutados en el servidor.
- Sesiones autónomas: sesión local devuelta en una aplicación mono usuario (útil en las fases de desarrollo y de prueba de las aplicaciones cliente/servidor).
All session types can handle privileges, but only the code executed in a web context is actually controlled by session's privileges.
Resumen
| .clearPrivileges() : Boolean elimina todos los privilegios asociados a la sesión (excluyendo privilegios promocionados)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 |
| .demote( promoteId : Integer ) elimina del proceso web el privilegio promocionado cuyo id pasó en promoteId, si fue añadido previamente por la función .promote() |
| .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 de escritorio o web |
| .isGuest() : Boolean devuelve True mientras no se llame a setPrivileges() en la sesión o después de que se haya ejecutado un Qodly logout en la sesión |
| .promote( privilege : Text ) : Integer añade el privilegio definido en el parámetro privilege al proceso actual durante la ejecución de la función de llamada y devuelve el id del privilegio promovido |
| .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 |
|---|---|
| 21 | Soporte de sesiones remotas y autónomas |
| 18 R6 | Añadidos |
.clearPrivileges() : Boolean
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| Resultado | Boolean | <- | True si la ejecución se ha realizado correctamente |
Descripción
La función .clearPrivileges() elimina todos los privilegios asociados a la sesión (excluyendo privilegios promocionados)y devuelve True si la ejecución se ha realizado correctamente.
Esta función no elimina los privilegios promovidos del proceso web, tanto si se han añadido a través del archivo roles.json como de la función promote().
Tenga en cuenta que los privilegios sólo se aplican al código ejecutado a través de accesos web, sea cual sea el tipo de sesión sobre el que se ejecuta esta función.
Ejemplo
//Invalidate a web user session
var $isOK : Boolean
$isOK:=Session.clearPrivileges()
.createOTP()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 21 | Support of remote and standalone sessions |
| 20 R9 | Añadidos |
.createOTP ( { lifespan : Integer } ) : Text
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| lifespan | Integer | -> | Session token lifespan in seconds (web sessions only) |
| Resultado | Text | <- | UUID del token |
Descripción
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.
Si se utiliza un token caducado para restaurar la sesión, se ignora.
For web sessions, you can set a custom timeout by passing a value in seconds in lifespan. 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.
For desktop sessions, the token is created with a 10 seconds lifespan.
The returned token can be used in exchanges with third-party applications or websites to securely identify the session. Por ejemplo, el token OTP de sesión se puede utilizar con una aplicación de pago.
The returned token can be used by 4D Server or 4D single-user application to identify requests coming from the web that share the session.
Ejemplo
var $token : Text
$token := Session.createOTP( 60 ) //el token es válido durante 1 mn
.demote()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 20 R10 | Añadidos |
.demote( promoteId : Integer )
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| promoteId | Integer | -> | Id devuelto por la función promote() |
Descripción
La función .demote() elimina del proceso web el privilegio promocionado cuyo id pasó en promoteId, si fue añadido previamente por la función .promote().
Si ningún privilegio con promoteId fue promovido usando .promote() en el proceso web, la función no hace nada.
Si se han añadido varios privilegios al proceso web, se debe llamar a la función demote() para cada uno de ellos con el promoteId apropiado. Los privilegios se apilan en el orden en que se han añadido al proceso, se recomienda desapilar los privilegios en un orden LIFO (Last In, First Out).
Tenga en cuenta que los privilegios sólo se aplican al código ejecutado a través de accesos web, sea cual sea el tipo de sesión sobre el que se ejecuta esta función.
Ejemplo
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
Ver también
.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 |
|---|---|
| 21 | Soporte de sesiones remotas y autónomas |
| 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.
Esta función devuelve los privilegios asignados a una Sesión utilizando únicamente la función setPrivileges(). Los privilegios promocionados NO son devueltos por la función, ya sea a través del archivo roles.json o la función promote().
Tenga en cuenta que los privilegios sólo se aplican al código ejecutado a través de accesos web, sea cual sea el tipo de sesión sobre el que se ejecuta esta función.
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 |
|---|---|
| 21 | Devuelve True para privilegios promovidos, Soporte de sesiones remotas y autónomas |
| 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.
Esta función devuelve True para el privilegio si se llama desde una función que fue promovida para este privilegio (ya sea a través del archivo roles.json o la función promote()).
Tenga en cuenta que los privilegios sólo se aplican al código ejecutado a través de accesos web, sea cual sea el tipo de sesión sobre el que se ejecuta esta función.
Ejemplo
Desea verificar si el privilegio "CreateInvoices" está asociado a la sesión del usuario web:
If (Session.hasPrivilege("CreateInvoices"))
//Acceso a las funciones de creación de facturas
Else
//Sin acceso a las funciones de creación de facturas
End if
Ver también
.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ñadidos |
.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
La propiedad .info describe la sesión de escritorio o web.
- Sesiones remotas y Sesiones de procedimientos almacenados: el objeto
.infoes el mismo objeto que el devuelto en la propiedad "session" por el comandoProcess activity. - Sesiones estándar: el objeto
.infoes el mismo objeto que el devuelto por el comandoSession info. - Web user sessions: The
.infoobject contains properties available for web user sessions.
El objeto .info contiene las siguientes propiedades:
| Propiedad | Tipo | Descripción |
|---|---|---|
| type | Text | Tipo de sesión: "remote", "storedProcedure", "standalone", "rest", "web" |
| 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 de invitado, False en caso contrario (sólo sesiones web) |
Descripción
Esta función siempre devuelve False con sesiones de escritorio.
La función .isGuest() devuelve True mientras no se llame a setPrivileges() en la sesión o después de que se haya ejecutado un Qodly logout en la sesión.
When the forcelogin mode is disabled, .isGuest() returns True if the session has no privileges.
Ejemplo
En el método base On Web Connection:
If (Session.isGuest())
//Hacer algo para el usuario invitado
End if
.promote()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 20 R10 | Añadidos |
.promote( privilege : Text ) : Integer
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| privilege | Text | -> | Nombre del privilegio |
| Resultado | Integer | <- | id a utilizar al llamar a la función demote() |
Descripción
La función .promote() añade el privilegio definido en el parámetro privilege al proceso actual durante la ejecución de la función de llamada y devuelve el id del privilegio promovido.
La adición dinámica de privilegios es útil cuando los derechos de acceso dependen del contexto de ejecución, que no puede definirse completamente en el archivo "roles.json". Esto es especialmente relevante cuando la misma función puede ser ejecutada por usuarios con diferentes niveles de acceso. El uso de .promote() asegura que sólo el proceso actual reciba los privilegios necesarios, sin afectar a otros.
La función no hace nada y devuelve 0 si:
- el privilegio no existe en el archivo
roles.json, - el privilegio ya está asignado al proceso actual (usando
.promote()o a través de una acción de promoción estática declarada para la función de llamada en el archivoroles.json).
Puede llamar a la función promote() varias veces en el mismo proceso para añadir diferentes privilegios.
El id devuelto se incrementa cada vez que un privilegio se añade dinámicamente al proceso.
Para eliminar un privilegio dinámicamente, llame a la función demote() con el id apropiado.
Tenga en cuenta que los privilegios sólo se aplican al código ejecutado a través de accesos web, sea cual sea el tipo de sesión sobre el que se ejecuta esta función.
Ejemplo
Varios usuarios se conectan a un único punto final que sirve a distintas aplicaciones. Un usuario de la aplicación #1 no necesita el privilegio "super_admin" porque no crea "VerySensitiveInfo". Un usuario de la aplicación #2 necesita privilegios "super_admin".
Puede proporcionar dinámicamente los privilegios adecuados en la función 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
Ver también
.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
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).
Tenga en cuenta que los privilegios sólo se aplican al código ejecutado a través de accesos web, sea cual sea el tipo de sesión sobre el que se ejecuta esta funció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 |
|---|---|
| 21 | Soporte de sesiones remotas y autónomas |
| 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
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 a asociar a la sesión (opcional, únicamente para las sesiones web). No disponible en sesiones de clientes remotos (ignorada). |
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).
Tenga en cuenta que los privilegios sólo se aplican al código ejecutado a través de accesos web, sea cual sea el tipo de sesión sobre el que se ejecuta esta función.
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 sesiones de escritorio |
| 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
Storagedel servidor, la propiedad.storagees siempre "single": añadir un objeto compartido o una colección compartida a.storageno 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.
Cuando una sesión de escritorio y una sesión web son compartidas usando un OTP, también comparten el mismo objeto .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 sesiones de escritorio |
| 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.
- Sesiones web: esta propiedad es una cadena vacía por defecto. Puede definirse mediante la propiedad
privilegesde la funciónsetPrivileges(). - Sesiones de procedimiento remoto/almacenado: esta propiedad devuelve el mismo nombre de usuario que el comando
Usuario actual. - Sesiones autónomas: esta propiedad contiene "designer" o el nombre definido con el comando
SET USER ALIAS.
Esta propiedad es sólo de lectura para las sesiones de escritorio.