メインコンテンツまでスキップ
バージョン: 20 R7 BETA

Session

Session オブジェクトは Session コマンドによって返されます。 このオブジェクトは、カレントユーザーセッションを管理するためのインターフェースをデベロッパーに対して提供し、コンテキストデータの保存、プロセス間の情報共有、セッションに関連したプリエンプティブプロセスの開始などのアクションの実行や、アクセス権 の管理を可能にします。

セッションの種類

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

Session オブジェクトにおいて利用可能なプロパティと関数は、セッションの種類に依存します。

概要

.clearPrivileges() : Boolean
対象セッションに紐づいているアクセス権をすべて削除し、実行が成功した場合に true を返します。
.expirationDate : Text
セッションcookie の有効期限
.getPrivileges() : Collection
対象セッションに紐づいている全アクセス権の名称のコレクションを返します
.hasPrivilege( privilege : Text ) : Boolean
対象セッションに privilege のアクセス権が紐づいていれば true、でなければ false を返します
.id : Text
サーバー上のセッションの一意な識別子 (UUID) を格納します
.idleTimeout : Integer
対象セッションが 4D によって終了されるまでの、非アクティブタイムアウト時間 (分単位)
.info : Object
サーバー上のリモートクライアントまたはストアドプロシージャーセッションの情報を格納します
.isGuest() : Boolean
アクセス権のないゲストセッションの場合は true を返します
.setPrivileges( privilege : Text ) : Boolean
.setPrivileges( privileges : Collection )
.setPrivileges( settings : Object ) : Boolean

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

.clearPrivileges()

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

.clearPrivileges() : Boolean

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

説明

この関数は、リモートクライアントとストアドプロシージャーのセッションでは何もせず、常に true を返します。

.clearPrivileges() 関数は、対象セッションに紐づいているアクセス権をすべて削除し、実行が成功した場合に true を返します。。 結果的に、当該セッションは自動的にゲストセッションになります。

例題

// Webユーザーセッションを無効にします
var $isGuest : Boolean
var $isOK : Boolean

$isOK:=Session.clearPrivileges()
$isGuest:=Session.isGuest() // $isGuest は true

.expirationDate

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

.expirationDate : Text

説明

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

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

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

例題

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

.getPrivileges()

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

.getPrivileges() : Collection

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

説明

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

リモートクライアントおよびストアドプロシージャーセッションでは、この関数は "WebAdmin" のみを含むコレクションを返します。

info

権限は、setPrivileges() 関数によって、セッションに割り当てられます。

例題

以下の 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()
ブログ記事: セッション権限を検査してデバッグを容易に

.hasPrivilege()

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

.hasPrivilege( privilege : Text ) : Boolean

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

説明

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

リモートクライアントとストアドプロシージャーセッションでは、この関数は privilege に関係なく、常に True を返します。

例題

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

If (Session.hasPrivilege("WebAdmin"))
// アクセス権が付与されているので、何もしません
Else
// 認証ページを表示します
End if

.id

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

.id : Text

説明

.id プロパティは、サーバー上のセッションの一意な識別子 (UUID) を格納します。 この一意の文字列は、サーバーによって各セッションに対して自動的に割り当てられ、そのプロセスを識別することを可能にします。

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

説明

このプロパティは、リモートクライアントおよびストアドプロシージャーセッションの場合にのみ使用できます。

.info プロパティは、サーバー上のリモートクライアントまたはストアドプロシージャーセッションの情報を格納します。

.info オブジェクトは、リモートクライアントおよびストアドプロシージャーセッションに対して Process activity コマンドによって返されるオブジェクトと同じです。

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

プロパティ説明
typeTextセッションタイプ: "remote" または "storedProcedure"
userNameText4Dユーザー名 (.userName と同じ値)
machineNameTextリモートセッション: リモートマシンの名前。 ストアドプロシージャーセッション: サーバーマシンの名前
systemUserNameTextリモートセッション: リモートマシン上で開かれたシステムセッションの名前。
IPAddressTextリモートマシンの IPアドレス。
hostTypeTextホストタイプ: "windows" または "mac"
creationDateTime日付 (ISO 8601)セッション作成の日時
stateTextセッションの状態: "active", "postponed", "sleeping"
IDTextセッションUUID (.id と同じ値))
persistentIDTextリモートセッション: セッションの永続的な ID

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

.isGuest()

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

.isGuest() : Boolean

引数説明
戻り値Boolean<-ゲストセッションの場合は true、それ以外は false

説明

この関数は、リモートクライアントとストアドプロシージャーのセッションでは常に false を返します。

.isGuest() 関数は、アクセス権のないゲストセッションの場合は true を返します。

例題

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

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

.setPrivileges()

履歴
リリース内容
19 R8roles プロパティをサポート
18 R6追加

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

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

説明

この関数は、リモートクライアントとストアドプロシージャーのセッションでは何もせず、常に false を返します。

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

  • privilege には、アクセス権の名称を文字列として渡します (複数の場合はカンマ区切り)。

  • privileges には、アクセス権の名称を文字列のコレクションとして渡します。

  • settings には、以下のプロパティを持つオブジェクトを渡します:

プロパティ説明
privilegesText または Collection
  • アクセス権名の文字列
  • アクセス権名のコレクション
  • rolesText または Collection
  • ロールの文字列
  • ロールの文字列のコレクション
  • userNameText(任意) セッションと紐づけるユーザー名

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

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

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

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

    例題

    カスタムな認証メソッドにおいて、ユーザーに "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 プロパティは空です。 共有オブジェクトのため、このプロパティはサーバー上の Storage オブジェクトにおいて利用可能です。

    サーバーの Storage オブジェクトと同様に、.storage プロパティは常に "single" で存在します。 共有オブジェクトや共有コレクションを .storage に追加しても、共有グループは作成されません。

    このプロパティは 読み取り専用 ですが、戻り値のオブジェクトは読み書き可能です。

    tip

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

    Webセッションの例題

    クライアントの IP を .storage プロパティに保存します。 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 コマンドと同じユーザー名を返します。

    このプロパティは 読み取り専用 です。