メインコンテンツまでスキップ
バージョン: 次へ

Session

Session オブジェクトは Session コマンドによって返されます。 These objects provide the developer with an interface allowing to manage the current session and execute actions such as store contextual data, share information between session processes, launch session-related preemptive processes, or (web context only) manage privileges.

セッションの種類

このクラスは以下の種類のセッションをサポートしています:

セッション権限について

全てのセッションタイプは権限を管理できますが、web コンテキスト 内で実行されたコードに関してだけは、実際にはセッションの権限によって管理されます。

概要

.clearPrivileges() : Boolean
対象セッションに紐づいているアクセス権をすべて削除し(昇格した権限を除く)、実行が成功した場合に true を返します
.createOTP ( { lifespan : Integer } ) : Text
セッションの新しいOTP(One Time Passcode、ワンタイムパスワード)を作成し、そのトークンUUID を返します。
.demote( promoteId : Integer )
promoteId 引数に ID を渡した昇格した権限を、Web プロセスから削除します(その権限が .promote() 関数を使用して以前追加された場合)
.expirationDate : Text
セッションcookie の有効期限
.getPrivileges() : Collection
対象セッションに紐づいている全アクセス権の名称のコレクションを返します
.hasPrivilege( privilege : Text ) : Boolean
対象セッションに privilege のアクセス権が紐づいていれば true、でなければ false を返します
.id : Text
ユーザーセッションの固有のID を格納しています
.idleTimeout : Integer
対象セッションが 4D によって終了されるまでの、非アクティブタイムアウト時間 (分単位)
.info : Object
describes the session
.isGuest() : Boolean
セッション内でsetPrivileges()\ が呼ばれていない、あるいはセッション内でQodly logout が実行されたあとである場合には True を返します
.promote( privilege : Text ) : Integer
privilege 引数で定義された権限を、呼び出し関数の実行中にカレントプロセスに追加し、昇格した権限の ID を返します
.restore ( token : Text ) : Boolean
カレントのWeb ユーザーセッションをtoken 引数のUUIDに対応したオリジナルのセッションで置き換えます
.setPrivileges( privilege : Text ) : Boolean
.setPrivileges( privileges : Collection )
.setPrivileges( settings : Object ) : Boolean

引数として渡したアクセス権やロールをセッションと紐づけ、実行が成功した場合に true を返します
.storage : Object
セッションのすべてのプロセスで利用可能な情報を保存しておける共有オブジェクトを格納します
.userName : Text
セッションと紐づいたユーザー名

.clearPrivileges()

履歴
リリース内容
21リモートおよびスタンドアロンセッションのサポート
18 R6追加

.clearPrivileges() : Boolean

引数説明
戻り値Boolean<-実行が正常に終わった場合には true

説明

.clearPrivileges() 関数は、対象セッションに紐づいているアクセス権をすべて削除し(昇格した権限を除く)、実行が成功した場合に true を返します。

注記
  • 権限は、この関数が実行されたセッションの種類 に関わらず、Web アクセスを通して実行されたコードにのみ適用されるという点に注意してください。
  • この関数は roles.json ファイルで追加されたものであれ promote() 関数で追加されたものであれ、Web プロセスから昇格された権限 を削除しません。
  • For security reasons, this function cannot be called from the client side of a remote user session (an error is returned).

例題

// Web ユーザーセッションを無効化する
var $isOK : Boolean

$isOK:=Session.clearPrivileges()

.createOTP()

履歴
リリース内容
21リモートおよびスタンドアロンセッションのサポート
20 R9追加

.createOTP ( { lifespan : Integer } ) : Text

引数説明
lifespanInteger->セッショントークンの有効期限(秒)
戻り値Text<-トークンの UUID

説明

.createOTP() 関数は、セッションの新しいOTP(One Time Passcode、ワンタイムパスワード)を作成し、そのトークンUUID を返します。 このトークンはそれが生成されたセッションに固有のものです。

lifespan に秒単位の値を渡すことで、カスタムのタイムアウト時間を設定することができます。 lifespan 引数が省略された場合はデフォルトで:

  • for web sessions, the token is created with the same lifespan as the .idleTimeOut of the session.
  • for remote user sessions, the token is created with a 10 seconds lifespan.

In web sessions, the returned token can be used in exchanges with third-party applications or websites to securely identify the session. 例えば、セッションOTP トークンは支払いアプリケーションなどにおいて使用することができます。

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.

OTP トークンについてのより詳細な情報については、こちらの章を参照して下さい。

セッションを復元するために失効したトークンを使用した場合、それは無視されます。

例題

var $token : Text
$token := Session.createOTP( 60 ) // トークンは1分間有効

.demote()

履歴
リリース内容
20 R10追加

.demote( promoteId : Integer )

引数説明
promoteIdInteger->promote() 関数から返されたID

説明

.demote() 関数は promoteId 引数に ID を渡した昇格した権限を、Web プロセスから削除します(その権限が .promote() 関数を使用して以前追加された場合)。

Web プロセス内において promoteId で指定した権限が .promote() を使用して昇格したものではなかった場合、この関数は何もしません。

Web プロセスに複数の権限が追加されていた場合、 demote() 関数はそれぞれの権限に対して適切な promoteId を使用して呼び出す必要があります。 権限はプロセスに対して追加された順番でスタックされているため、スタックを解除する場合にはLIFO (Last In, First Out) 順で解除することが推奨されます。

注記
  • 権限は、この関数が実行されたセッションの種類 に関わらず、Web アクセスを通して実行されたコードにのみ適用されるという点に注意してください。
  • This function cannot be called from the client side of a remote user session (an error is returned).

例題

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

参照

.promote()

.expirationDate

履歴
リリース内容
18 R6追加

.expirationDate : Text

説明

このプロパティは、Webユーザーセッションの場合にのみ使用できます。

.expirationDate プロパティは、セッションcookie の有効期限を返します。 値は ISO 8601標準に従って文字列で表現されます: YYYY-MM-DDTHH:MM:SS.mmmZ。 値は ISO 8601標準に従って文字列で表現されます: YYYY-MM-DDTHH:MM:SS.mmmZ

このプロパティは 読み取り専用 です。 このプロパティは 読み取り専用 です。 .idleTimeout プロパティ値が変更された場合、有効期限は自動的に再計算されます。

例題

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

.getPrivileges()

履歴
リリース内容
21リモートおよびスタンドアロンセッションのサポート
20 R6追加

.getPrivileges() : Collection

引数説明
戻り値Collection<-アクセス権の名称 (文字列) のコレクション

説明

.getPrivileges() 関数は、対象セッションに紐づいている全アクセス権の名称のコレクションを返します。

この関数は、 setPrivileges() 関数を使用してセッションに割り当てられた権限を返します。 昇格した権限は、roles.json ファイルで追加されたか promote() 関数で追加されたかに関わらず、この関数によっては返されません。

権限は、この関数が実行されたセッションの種類 に関わらず、Web アクセスを通して実行されたコードにのみ適用されるという点に注意してください。

例題

以下の roles.json が定義されています:

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

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

]
}
}

セッションのロールは、DaraStore クラスの authentify() 関数内で割り当てられます:

  // DataStore クラス

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

"medium" ロールを指定して authentify() 関数が呼び出された場合:

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

参照

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

.hasPrivilege()

履歴
リリース内容
21昇格した権限ならTrue を返す、リモートおよびスタンドアロンセッションのサポート
18 R6追加

.hasPrivilege( privilege : Text ) : Boolean

引数説明
privilegeText->確認するアクセス権の名称
戻り値Boolean<-セッションが privilege のアクセス権を持っていれば true、それ以外は false

説明

.hasPrivilege() 関数は、対象セッションに privilege のアクセス権が紐づいていれば true、でなければ false を返します。

この関数は、 privilege 引数で指定した権限が、その権限にのために(roles.json ファイルまたは promote() 関数を通して)昇格された関数から呼び出された場合には、True を返します。

権限は、この関数が実行されたセッションの種類 に関わらず、Web アクセスを通して実行されたコードにのみ適用されるという点に注意してください。

例題

"CreateInvoices" アクセス権が Webユーザーセッションに紐づいているかを確認します:

If (Session.hasPrivilege("CreateInvoices"))
// 請求書作成機能へのアクセスを許可
Else
// 請求書作成機能へのアクセスはなし

End if

参照

Restrict data according to privileges or information saved in session storage (blog 記事)

.id

履歴
リリース内容
20 R5追加

.id : Text

説明

.id プロパティは、ユーザーセッションの固有のID を格納しています。

4D Server ではこの一意の文字列は、サーバーによって各セッションに対して自動的に割り当てられ、そのプロセスを識別することを可能にします。 It is available in both the Session on the server side and on the client side.

tip

Session storage コマンドにこのプロパティを渡すことで、セッションの.storage オブジェクトを取得できます。

.idleTimeout

履歴
リリース内容
18 R6追加

.idleTimeout : Integer

説明

このプロパティは、Webユーザーセッションの場合にのみ使用できます。

.idleTimeout プロパティは、対象セッションが 4D によって終了されるまでの、非アクティブタイムアウト時間 (分単位)を格納します。

プロパティ未設定時のデフォルト値は 60 (1時間) です。

このプロパティが設定されると、それに応じて .expirationDate プロパティも更新されます。

60 (分) 未満の値を指定することはできません (60 未満の値を設定した場合、タイムアウトは 60 (分) に設定されます)。

このプロパティは 読み書き可能 です。

例題

If (Session.isGuest())
// ゲストセッションは、60分の非アクティブ時間経過後に終了します
Session.idleTimeout:=60
Else
// その他のセッションは、120分の非アクティブ時間経過後に終了します
Session.idleTimeout:=120
End if

.info

履歴
リリース内容
20 R5追加

.info : Object

説明

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.
  • スタンドアロンセッションの場合: .info オブジェクトは、Session info コマンドで返されるものと同じオブジェクトです。
  • Web ユーザーセッション: .info オブジェクトにはWeb ユーザーセッションにおいて利用可能なプロパティが格納されています。

.info オブジェクトには、次のプロパティが格納されています:

プロパティ説明
typeTextセッションのタイプ: "remote"、"storedProcedure"、"standalone"、"rest"、"web"
userNameText4Dユーザー名 (.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"
    hostTypeTextHost type: "windows", "mac", or "browser"
    creationDateTime日付 (ISO 8601)Date and time of session creation (standalone session: date and time of application startup)
    stateTextセッションの状態: "active", "postponed", "sleeping"
    IDTextセッションUUID (.id と同じ値))
    persistentIDTextRemote/client sessions: Session's persistent ID

    .info は計算プロパティなため、そのプロパティに対して何らかの処理をおこないたい場合は、呼び出し後にローカル変数に保存することが推奨されます。

    .isGuest()

    履歴
    リリース内容
    18 R6追加

    .isGuest() : Boolean

    引数説明
    戻り値Boolean<-セッションがゲストセッションの場合はTrue、それ以外はFalse (Web セッションのみ)

    説明

    This function always returns False with non-web sessions.

    .isGuest() 関数は セッション内でsetPrivileges()` が呼ばれていない、あるいはセッション内でQodly logout が実行されたあとである場合には True を返します。

    互換性

    強制ログイン モード が無効化されているとき、.isGuest() は、セッションに権限がない場合に True を返します。

    例題

    On Web Connection データベースメソッドにて:

    If (Session.isGuest())
    // ゲストユーザー用の処理
    End if

    .promote()

    履歴
    リリース内容
    20 R10追加

    .promote( privilege : Text ) : Integer

    引数説明
    privilegeText->アクセス権の名称
    戻り値Integer<-demote() function関数を呼び出す際に使用する ID

    説明

    .promote() 関数は、privilege 引数で定義された権限を、呼び出し関数の実行中にカレントプロセスに追加し、昇格した権限の ID を返します。

    権限を動的に付与することは、アクセス権が実行コンテキストに依存する場合には有用です。この場合 "roles.json" ファイルだけでは完全に定義しきることはできないからです。 これは、異なるアクセスレベルのユーザーによって同じ関数が実行され得る場合に関連します。 .promote() を使用することで、他のプロセスに影響することなく、カレントプロセスにのみ必要な権限が与えられるようにすることができます。

    この関数は、以下の場合には何もせずに 0 を返します:

    • roles.json ファイル内に privilege 引数で指定した権限が存在しない場合
    • privilege が既に(.promote() を使用するか、あるいは roles.json ファイル内で呼び出し関数に対して宣言されている静的な昇格アクション を通して)カレントプロセスに対して割り当てられている場合。

    promote() 関数を同じプロセスに対して複数回呼び出すことで、異なる権限を追加することができます。

    権限がプロセスに対して動的に追加されるたびに、返されるID はインクリメントされます。

    権限を動的に削除するためには、適切なID で demote() 関数を呼び出してください。

    注記
    • 権限は、この関数が実行されたセッションの種類 に関わらず、Web アクセスを通して実行されたコードにのみ適用されるという点に注意してください。
    • This function cannot be called from the client side of a remote user session (an error is returned).

    例題

    複数のユーザーが、異なるアプリケーションとして振る舞う単一のエンドポイントに接続する場合を考えます。 #1 のアプリケーションからのユーザーは、"VerySensitiveInfo" を作成しないため、 "super_admin" 権限を必要としません。 一方で#2 のアプリケーションからのユーザーは "super_admin" 権限を必要とします。

    この場合、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

    参照

    .demote()
    hasPrivilege()

    .restore()

    履歴
    リリース内容
    20 R9追加

    .restore ( token : Text ) : Boolean

    引数説明
    tokenText->セッショントークンUUID
    戻り値Boolean<-カレントのセッションがトークンのセッションで正常に置き換えられた場合にはTrue

    説明

    .restore() 関数は、カレントのWeb ユーザーセッションをtoken 引数のUUIDに対応したオリジナルのセッションで置き換えます。 セッションのストレージと権限は復元されます。

    オリジナルのセッションが正常に復元された場合、この関数はtrue を返します。

    今関数は以下の場合にはfalse を返します:

    • セッショントークンが既に使用されていた場合
    • セッショントークンが失効してしまっている場合
    • セッショントークンが存在しない場合
    • オリジナルのセッション自身が失効してしまっている場合

    これらの場合には、カレントのWeb ユーザーセッションはそのまま残されます(セッションは復元されません)。

    注記
    • 権限は、この関数が実行されたセッションの種類 に関わらず、Web アクセスを通して実行されたコードにのみ適用されるという点に注意してください。
    • This function cannot be called from the client side of a remote user session (an error is returned).

    例題

    カスタムのHTTP リクエストハンドラーから呼ばれたシングルトンの例:

    shared singleton Class constructor()

    Function callback($request : 4D.IncomingMessage) : 4D.OutgoingMessage
    Session.restore($request.urlQuery.state)

    参照

    .createOTP()

    .setPrivileges()

    履歴
    リリース内容
    21リモートおよびスタンドアロンセッションのサポート
    19 R8roles プロパティをサポート
    18 R6追加

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

    引数説明
    privilegeText->アクセス権の名称
    privilegesCollection->アクセス権の名称のコレクション
    settingsObject->"privileges" プロパティ (文字列またはコレクション) を持つオブジェクト
    戻り値Boolean<-実行が正常に終わった場合には true

    説明

    .setPrivileges() 関数は、引数として渡したアクセス権やロールをセッションと紐づけ、実行が成功した場合に true を返します。

    • privilege には、アクセス権の名称を文字列として渡します (複数の場合はカンマ区切り)。
    • privileges には、アクセス権の名称を文字列のコレクションとして渡します。
    • settings には、以下のプロパティを持つオブジェクトを渡します:
    プロパティ説明
    privilegesText または Collection
  • アクセス権名の文字列
  • アクセス権名のコレクション
  • rolesText または Collection
  • ロールの文字列
  • ロールの文字列のコレクション
  • userNameTextセッションに関連づけるユーザー名(任意、Web セッションのみ)。 リモートクライアントセッションでは利用できません(無視されます)。

    権限とロールは、プロジェクトの roles.json ファイルで定義されます。 詳細については、権限 を参照してください。

    privileges または roles プロパティに、roles.json ファイルで宣言されていない名前が含まれている場合、その名前は無視されます。

    セッションにアクセス権またはロールが紐づいていない場合、そのセッションはデフォルトで ゲストセッション です。

    userName プロパティは Session オブジェクトレベルで利用可能です (読み取り専用)。

    注記
    • 権限は、この関数が実行されたセッションの種類 に関わらず、Web アクセスを通して実行されたコードにのみ適用されるという点に注意してください。
    • This function cannot be called from the client side of a remote user session (an error is returned).

    例題

    カスタムな認証メソッドにおいて、ユーザーに "WebAdmin" アクセス権を付与します:

    var $userOK : Boolean

    ... // ユーザー認証

    If ($userOK) // ユーザー認証に成功した場合
    var $info : Object
    $info:=New object()
    $info.privileges:=New collection("WebAdmin")
    Session.setPrivileges($info)
    End if

    参照

    .getPrivileges()

    .storage

    履歴
    リリース内容
    20 R5デスクトップセッションのサポート
    18 R6追加

    .storage : Object

    説明

    .storage プロパティは、セッションのすべてのプロセスで利用可能な情報を保存しておける共有オブジェクトを格納します。

    Session オブジェクトの作成時には、.storage プロパティは空です。 このプロパティは 読み取り専用 ですが、戻り値のオブジェクトは読み書き可能です。

    注記
    • Since it is a shared object, this property will be available in the Storage object of the machine (server or client).
    • 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.

    In client/server, the .storage object of the remote user session is not the same on the server and on the client.

    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

    セッションの.storage プロパティはSession storage コマンドを使用することで取得できます。

    Webセッションの例題

    クライアントの IP を .storage プロパティに保存します。 On Web Authentication データベースメソッドに以下のように書けます: On Web Authentication データベースメソッドに以下のように書けます:

    If (Session.storage.clientIP=Null) // 最初のアクセス
    Use (Session.storage)
    Session.storage.clientIP:=New shared object("value"; $clientIP)
    End use
    End if

    リモートセッションの例題

    同じセッションのプロセス間でデータを共有したい場合:

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

    .userName

    履歴
    リリース内容
    20 R5デスクトップセッションのサポート
    18 R6追加

    .userName : Text

    説明

    .userName プロパティは、セッションと紐づいたユーザー名を格納します。 このプロパティは、コード内でユーザーを確認するのに使用できます。

    • Web セッション: このプロパティはデフォルトで空の文字列です。 これは、setPrivileges() 関数の privileges プロパティを使って設定することができます。
    • リモート/ ストアドプロシージャーセッション: このプロパティは Current user コマンドと同じユーザー名を返します。
    • スタンドアロンセッション: このプロパティは"designer" またはSET USER ALIAS コマンドで設定された名前が格納されています。

    このプロパティはデスクトップセッションにおいては読み取り専用です。