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

Session

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

セッションの種類

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

セッション権限について

全てのセッションタイプは権限を管理できますが、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
セッションの情報を格納します
.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 プロセスから昇格された権限 を削除しません。
  • セキュリティ上の理由から、この関数はリモートユーザーセッションのクライアント側から呼び出すことはできません(エラーが返されます)。

例題

// 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 引数が省略された場合はデフォルトで:

  • Web セッションの場合、トークンはセッションの.idleTimeOut と同じ有効期限を持って作成されます。
  • リモートユーザーセッションの場合、トークンは10秒の有効期限を持って作成されます。

Web セッションにおいては、返されたトークンは、サードパーティアプリケーションや他のWebサイトとのやり取りで使用することでセッションを安全に特定することができます。 例えば、セッションOTP トークンは支払いアプリケーションなどにおいて使用することができます。

リモートユーザーセッション(あるいはテスト目的でのスタンドアロンセッション)においては、返されたトークンを使用することで、4D がセッションを共有した Web からのリクエストを特定することができます。

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 アクセスを通して実行されたコードにのみ適用されるという点に注意してください。
  • この関数は、リモートユーザーセッションのクライアント側から呼び出すことはできません(エラーが返されます)。

例題

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 ではこの一意の文字列は、サーバーによって各セッションに対して自動的に割り当てられ、そのプロセスを識別することを可能にします。 サーバー側とクライアント側の、両方の Session から利用可能です。

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

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

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

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

    .isGuest()

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

    .isGuest() : Boolean

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

    説明

    この関数はWeb ではないセッションに対しては常に False を返します。

    .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 アクセスを通して実行されたコードにのみ適用されるという点に注意してください。
    • この関数は、リモートユーザーセッションのクライアント側から呼び出すことはできません(エラーが返されます)。

    例題

    複数のユーザーが、異なるアプリケーションとして振る舞う単一のエンドポイントに接続する場合を考えます。 #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 アクセスを通して実行されたコードにのみ適用されるという点に注意してください。
    • この関数は、リモートユーザーセッションのクライアント側から呼び出すことはできません(エラーが返されます)。

    例題

    カスタムの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 アクセスを通して実行されたコードにのみ適用されるという点に注意してください。
    • この関数は、リモートユーザーセッションのクライアント側から呼び出すことはできません(エラーが返されます)。

    例題

    カスタムな認証メソッドにおいて、ユーザーに "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 に追加しても、共有グループは作成されません。

    クライアント/サーバーでは、リモートユーザーセッションの .storage オブジェクトは、サーバーまたはクライアントのものとは同じではありません

    リモートユーザーセッションとWeb セッションがOTP を使用して共有されていた 場合、これらはたとえOTP がクライアント側のセッションから作成 されていた場合でも、同じ.storage オブジェクトをサーバー上で共有します。

    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 コマンドで設定された名前が格納されています。

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