Saltar al contenido principal
Versión: Siguiente

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:

Acerca de los privilegios de sesión

Todos los tipos de sesión pueden manejar privilegios, pero sólo el código ejecutado en un contexto web está realmente controlado por los privilegios de sesión.

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
describes the session
.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
LanzamientoModificaciones
21Soporte de sesiones remotas y autónomas
18 R6Añadidos

.clearPrivileges() : Boolean

ParámetrosTipoDescripción
ResultadoBoolean<-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.

Notas
  • 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.
  • 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().
  • For security reasons, this function cannot be called from the client side of a remote user session (an error is returned).

Ejemplo

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

$isOK:=Session.clearPrivileges()

.createOTP()

Historia
LanzamientoModificaciones
21Soporte de sesiones remotas y autónomas
20 R9Añadidos

.createOTP ( { lifespan : Integer } ) : Text

ParámetrosTipoDescripción
lifespanInteger->Duración de la vida del token de sesión en segundos
ResultadoText<-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.

Puede definir un tiempo de espera personalizado pasando un valor en segundos en lifespan. Por defecto, si el parámetro lifespan se omite:

  • para sesiones web, el token se crea con la misma duración que el .idleTimeOut de la sesión.
  • para sesiones de usuarios remotos, el token se crea con una duración de 10 segundos.

In web sessions, 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.

In remote user sessions (and standalone sessions for test purposes), the returned token can be used by 4D to identify requests coming from the web that share the session.

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.

Ejemplo

var $token : Text
$token := Session.createOTP( 60 ) //el token es válido durante 1 mn

.demote()

Historia
LanzamientoModificaciones
20 R10Añadidos

.demote( promoteId : Integer )

ParámetrosTipoDescripción
promoteIdInteger->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).

Notas
  • 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.
  • This function cannot be called from the client side of a remote user session (an error is returned).

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

.promote()

.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
21Soporte de sesiones remotas y autónomas
20 R6Añadidos

.getPrivileges() : Collection

ParámetrosTipoDescripción
ResultadoCollection<-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.

nota

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().

nota

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
LanzamientoModificaciones
21Devuelve True para privilegios promovidos, Soporte de sesiones remotas y autónomas
18 R6Añadidos

.hasPrivilege( privilege : Text ) : Boolean

ParámetrosTipoDescripción
privilegeText->Nombre del privilegio a verificar
ResultadoBoolean<-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.

nota

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()).

nota

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

Restringir datos según privilegios o información guardada en almacenamiento de sesión (entrada de blog)

.id

Historia
LanzamientoModificaciones
20 R5Añ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. It is available in both the Session on the server side and on the client side.

tip

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

.idleTimeout

Historia
LanzamientoModificaciones
18 R6Añadidos

.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

The .info property describes the session.

  • Remote user sessions and Stored procedure sessions: The .info object is the same object as the one returned in the "session" property by the Process activity command.
  • Sesiones estándar: el objeto .info es el mismo objeto que el devuelto por el comando Session info.
  • Sesiones usuario web: el objeto .info contiene las propiedades disponibles para las sesiones de usuario web.

El objeto .info contiene las siguientes propiedades:

PropiedadTipoDescripción
typeTextTipo de sesión: "remote", "storedProcedure", "standalone", "rest", "web"
userNameTextNombre de usuario 4D (mismo valor que .userName)
machineNameText
  • Remote sessions: name of the remote machine.
  • Client sessions: name of the local machine.
  • Stored procedures session: name of the server machine.
  • Standalone session: name of the machine
systemUserNameText
  • Remote sessions: name of the system session opened on the remote machine.
  • Client sessions: name of the local system session
    IPAddressText
    • Remote sessions: IP address of the remote machine.
    • Client sessions: IP address of the local machine.
    • Standalone session: "localhost"
    hostTypeTextTipo de host: "windows", "mac" o "browser"
    creationDateTimeDate ISO 8601Fecha y hora de creación de la sesión (sesión autónoma: fecha y hora de inicio de la aplicación)
    stateTextEstado de la sesión: "active", "postponed", "sleeping"
    IDTextUUID de sesión (el mismo valor que .id)
    persistentIDTextSesiones remotas servidor/clientes: ID 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
    ResultadoBoolean<-True si la sesión es de invitado, False en caso contrario (sólo sesiones web)

    Descripción

    nota

    This function always returns False with non-web sessions.

    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.

    Compatibilidad

    Cuando el modo forcelogin está desactivado, .isGuest() devuelve True si la sesión no tiene privilegios.

    Ejemplo

    En el método base On Web Connection:

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

    .promote()

    Historia
    LanzamientoModificaciones
    20 R10Añadidos

    .promote( privilege : Text ) : Integer

    ParámetrosTipoDescripción
    privilegeText->Nombre del privilegio
    ResultadoInteger<-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:

    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.

    Notas
    • 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.
    • This function cannot be called from the client side of a remote user session (an error is returned).

    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

    .demote()
    hasPrivilege()

    .restore()

    Historia
    LanzamientoModificaciones
    20 R9Añadidos

    .restore ( token : Text ) : Boolean

    ParámetrosTipoDescripción
    tokenText->UUID del token de sesión
    ResultadoBoolean<-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).

    Notas
    • 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.
    • This function cannot be called from the client side of a remote user session (an error is returned).

    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

    .createOTP()

    .setPrivileges()

    Historia
    LanzamientoModificaciones
    21Soporte de sesiones remotas y autónomas
    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)
    ResultadoBoolean<-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:
    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 a asociar a la sesión (opcional, únicamente para las sesiones web). No disponible en sesiones de clientes remotos (ignorada).
    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).

    Notas
    • 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.
    • This function cannot be called from the client side of a remote user session (an error is returned).

    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 sesiones de escritorio
    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. Esta propiedad es sólo lectura en sí misma pero devuelve un objeto de lectura-escritura.

    Notas
    • Al tratarse de un objeto compartido, esta propiedad estará disponible en el objeto Storage de la máquina (servidor o cliente).
    • Like the Storage object of the machine, the .storage property is always "single": adding a shared object or a shared collection to .storage does not create a shared group.

    En cliente/servidor, el objeto .storage de la sesión de usuario remota no es el mismo en el servidor y en el cliente.

    When a remote user session and a web session are shared using an OTP, they also share the same .storage object on the server, even if the OTP was created from the session on the client side.

    tip

    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
    LanzamientoModificaciones
    20 R5Soporte de sesiones de escritorio
    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.

    • Sesiones web: esta propiedad es una cadena vacía por defecto. Puede definirse mediante la propiedad privileges de la función setPrivileges().
    • 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.