Session
Session オブジェクトは Session コマンドによって返されます。  このオブジェクトは、カレントユーザーセッションを管理するためのインターフェースをデベロッパーに対して提供し、コンテキストデータの保存、プロセス間の情報共有、セッションに関連したプリエンプティブプロセスの開始などのアクションの実行や、アクセス権 の管理を可能にします。
セッションの種類
このクラスは以下の種類のセッションをサポートしています:
- Webユーザーセッション: プロジェクトにおいてスケーラブルセッションが有効化されている 場合、Webユーザーセッションが利用可能です。 これらは Web および REST 接続に使用され、権限を割り当てることができます。
- リモートクライアントユーザー セッション: クライアント/サーバーアプリケーションでは、リモートユーザーは、サーバー上で管理される独自のセッションを持ちます。
- ストアドプロシージャーセッション: サーバ上で実行されるすべてのストアドプロシージャーは、同じ仮想ユーザーセッションを共有します。
- スタンドアロンセッション: シングルユーザーアプリケーションで返されるローカルのセッションオブジェクト(クライアント/サーバーアプリケーションの開発およびテストフェーズにおいて有用です)。
Session オブジェクトにおいて利用可能なプロパティと関数は、セッションの種類に依存します。
概要
.clearPrivileges()
履歴
| リリース | 内容 | 
|---|---|
| 18 R6 | 追加 | 
.clearPrivileges()* : Boolean
| 引数 | 型 | 説明 | |
|---|---|---|---|
| 戻り値 | Boolean | <- | 実行が正常に終わった場合には true | 
説明
この関数は、リモートクライアント、ストアドプロシージャー、およびスタンドアロンのセッションでは何もせず、常に true を返します。
.clearPrivileges() 関数は、対象セッションに紐づいているアクセス権をすべて削除し(昇格した権限を除く)、実行が成功した場合に true を返します。
"強制ログイン" モード でない限り、セッションは自動的にゲストセッションとなります。 "強制ログイン" モードでは、.clearPrivileges() はセッションをゲストセッションへと変換するのではなく、セッションの権限を消去するだけです。
この関数は roles.json ファイルで追加されたものであれ promote() 関数で追加されたものであれ、Web プロセスから昇格された権限 を削除しません。
例題
// Webユーザーセッションを無効にします
var $isGuest : Boolean
var $isOK : Boolean
$isOK:=Session.clearPrivileges()
$isGuest:=Session.isGuest() // $isGuest は true
.createOTP()
履歴
| リリース | 内容 | 
|---|---|
| 20 R9 | 追加 | 
.createOTP* ( { lifespan : Integer } ) : Text
| 引数 | 型 | 説明 | |
|---|---|---|---|
| lifespan | Integer | -> | セッショントークンの有効期限(秒) | 
| 戻り値 | Text | <- | OTP トークンのUUID | 
説明
この関数は、Webユーザーセッションの場合にのみ使用できます。 他のコンテキストにおいては空の文字列を返します。
.createOTP() 関数は、セッションの新しいOTP(One Time Passcode、ワンタイムパスワード)を作成し、そのトークンUUID を返します。 このトークンはそれが生成されたセッションに固有のものです。
OTP トークンについてのより詳細な情報については、こちらの章を参照して下さい。
デフォルトで、lifespan 引数が省略された場合、トークンはセッションの.idleTimeOut と同じ有効期限を持って作成されます。 lifespan に秒単位の値を渡すことで、カスタムのタイムアウト時間を設定することができます。 Web ユーザーセッションを復元するために失効したトークンを使用した場合、それは無視されます。
返されたトークンは、サードパーティアプリケーションや他のWebサイトとのやり取りで使用することでセッションを安全に特定することができます。 例えば、セッションOTP トークンは支払いアプリケーションなどにおいて使用することができます。
例題
var $token : Text
$token := Session.createOTP( 60 ) // トークンは1分間有効
.demote()
履歴
| リリース | 内容 | 
|---|---|
| 20 R10 | 追加 | 
.demote*( promoteId : Integer )
| 引数 | 型 | 説明 | |
|---|---|---|---|
| promoteId | Integer | -> | promote()関数から返されたID | 
説明
この関数はリモートクライアント、ストアドプロシージャー、スタンドアロンのセッションにおいては何もしません。
.demote() 関数は promoteId 引数に ID を渡した昇格した権限を、Web プロセスから削除します(その権限が .promote() 関数を使用して以前追加された場合)。
Web プロセス内において promoteId で指定した権限が .promote() を使用して昇格したものではなかった場合、この関数は何もしません。
Web プロセスに複数の権限が追加されていた場合、 demote() 関数はそれぞれの権限に対して適切な promoteId を使用して呼び出す必要があります。 権限はプロセスに対して追加された順番でスタックされているため、スタックを解除する場合にはLIFO (Last In, First Out) 順で解除することが推奨されます。
例題
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
参照
.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()
履歴
| リリース | 内容 | 
|---|---|
| 20 R6 | 追加 | 
.getPrivileges*() : Collection
| 引数 | 型 | 説明 | |
|---|---|---|---|
| 戻り値 | Collection | <- | アクセス権の名称 (文字列) のコレクション | 
説明
.getPrivileges() 関数は、対象セッションに紐づいている全アクセス権の名称のコレクションを返します。
この関数は、 setPrivileges() 関数を使用してセッションに割り当てられた権限を返します。 昇格した権限は、roles.json ファイルで追加されたか promote() 関数で追加されたかに関わらず、この関数によっては返されません。
リモートクライアント、ストアドプロシージャーおよびスタンドアロンセッションでは、この関数は "WebAdmin" のみを含むコレクションを返します。
例題
以下の 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()
履歴
| リリース | 内容 | 
|---|---|
| 21 | 昇格した権限に対しては True を返します | 
| 18 R6 | 追加 | 
.hasPrivilege*( privilege : Text ) : Boolean
| 引数 | 型 | 説明 | |
|---|---|---|---|
| privilege | Text | -> | 確認するアクセス権の名称 | 
| 戻り値 | Boolean | <- | セッションが privilege のアクセス権を持っていれば true、それ以外は false | 
説明
.hasPrivilege() 関数は、対象セッションに privilege のアクセス権が紐づいていれば true、でなければ false を返します。
この関数は、 privilege 引数で指定した権限が、その権限にのために(roles.json ファイルまたは promote() 関数を通して)昇格された関数から呼び出された場合には、True を返します。
リモートクライアント、ストアドプロシージャーおよびスタンドアロンセッションでは、この関数は privilege に関係なく、常に True を返します。
例題
"WebAdmin" アクセス権が Webユーザーセッションに紐づいているかを確認します:
If (Session.hasPrivilege("WebAdmin"))
 // アクセス権が付与されているので、何もしません
Else
 // 認証ページを表示します
End if
.id
履歴
| リリース | 内容 | 
|---|---|
| 20 R5 | 追加 | 
.id* : Text
説明
.id プロパティは、ユーザーセッションの固有のID を格納しています。 4D Server ではこの一意の文字列は、サーバーによって各セッションに対して自動的に割り当てられ、そのプロセスを識別することを可能にします。
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コマンドによって返されるオブジェクトと同じです。
.info オブジェクトには、次のプロパティが格納されています:
| プロパティ | 型 | 説明 | 
|---|---|---|
| type | Text | セッションのタイプ: "remote"、"storedProcedure"、"standalone" | 
| userName | Text | 4Dユーザー名 ( .userNameと同じ値) | 
| machineName | Text | リモートセッション: リモートマシンの名前。 ストアドプロシージャセッション: サーバーマシンの名前。 スタンドアロンセッションの場合: マシン名 | 
| systemUserName | Text | リモートセッション: リモートマシン上で開かれたシステムセッションの名前。 | 
| IPAddress | Text | リモートマシンの IPアドレス。 | 
| hostType | Text | ホストタイプ: "windows" または "mac" | 
| creationDateTime | 日付 (ISO 8601) | セッション作成の日付と時間。 スタンドアロンセッションの場合: アプリケーション起動の日付と時間 | 
| state | Text | セッションの状態: "active", "postponed", "sleeping" | 
| ID | Text | セッションUUID ( .idと同じ値)) | 
| persistentID | Text | リモートセッション: セッションの永続的な ID | 
.info は計算プロパティなため、そのプロパティに対して何らかの処理をおこないたい場合は、呼び出し後にローカル変数に保存することが推奨されます。
.isGuest()
履歴
| リリース | 内容 | 
|---|---|
| 18 R6 | 追加 | 
.isGuest()* : Boolean
| 引数 | 型 | 説明 | |
|---|---|---|---|
| 戻り値 | Boolean | <- | ゲストセッションの場合は true、それ以外は false | 
説明
この関数は、リモートクライアント、ストアドプロシージャ、およびスタンドアロンセッションでは常にFalse を返します。
.isGuest() 関数は、アクセス権のないゲストセッションの場合は true を返します。
例題
On Web Connection データベースメソッドにて:
If (Session.isGuest())
 // ゲストユーザー用の処理
End if
.promote()
履歴
| リリース | 内容 | 
|---|---|
| 20 R10 | 追加 | 
.promote*( privilege : Text ) : Integer
| 引数 | 型 | 説明 | |
|---|---|---|---|
| privilege | Text | -> | アクセス権の名称 | 
| 戻り値 | Integer | <- | demote()function関数を呼び出す際に使用する ID | 
説明
この関数はリモートクライアント、ストアドプロシージャー、スタンドアロンのセッションにおいては何もしません。
.promote() 関数は、privilege 引数で定義された権限を、呼び出し関数の実行中にカレントプロセスに追加し、昇格した権限の ID を返します。
権限を動的に付与することは、アクセス権が実行コンテキストに依存する場合には有用です。この場合 "roles.json" ファイルだけでは完全に定義しきることはできないからです。 これは、異なるアクセスレベルのユーザーによって同じ関数が実行され得る場合に関連します。 .promote() を使用することで、他のプロセスに影響することなく、カレントプロセスにのみ必要な権限が与えられるようにすることができます。
この関数は、以下の場合には何もせずに 0 を返します:
- roles.jsonファイル内に privilege 引数で指定した権限が存在しない場合
- privilege が既に(.promote()を使用するか、あるいはroles.jsonファイル内で呼び出し関数に対して宣言されている静的な昇格アクション を通して)カレントプロセスに対して割り当てられている場合。
promote() 関数を同じプロセスに対して複数回呼び出すことで、異なる権限を追加することができます。
権限がプロセスに対して動的に追加されるたびに、返されるID はインクリメントされます。
権限を動的に削除するためには、適切なID で demote() 関数を呼び出してください。
例題
複数のユーザーが、異なるアプリケーションとして振る舞う単一のエンドポイントに接続する場合を考えます。 #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 
参照
.restore()
履歴
| リリース | 内容 | 
|---|---|
| 20 R9 | 追加 | 
.restore* ( token : Text ) : Boolean
| 引数 | 型 | 説明 | |
|---|---|---|---|
| token | Text | -> | セッショントークンUUID | 
| 戻り値 | Boolean | <- | カレントのセッションがトークンのセッションで正常に置き換えられた場合にはTrue | 
説明
この関数は、Webユーザーセッションの場合にのみ使用できます。 それ以外のコンテキストではFalse を返します。
.restore() 関数は、カレントのWeb ユーザーセッションをtoken 引数のUUIDに対応したオリジナルのセッションで置き換えます。 セッションのストレージと権限は復元されます。
オリジナルのセッションが正常に復元された場合、この関数はtrue を返します。
今関数は以下の場合にはfalse を返します:
- セッショントークンが既に使用されていた場合
- セッショントークンが失効してしまっている場合
- セッショントークンが存在しない場合
- オリジナルのセッション自身が失効してしまっている場合
これらの場合には、カレントのWeb ユーザーセッションはそのまま残されます(セッションは復元されません)。
例題
カスタムのHTTP リクエストハンドラーから呼ばれたシングルトンの例:
shared singleton Class constructor()
Function callback($request : 4D.IncomingMessage) : 4D.OutgoingMessage
   Session.restore($request.urlQuery.state) 
参照
.setPrivileges()
履歴
| リリース | 内容 | 
|---|---|
| 19 R8 | roles プロパティをサポート | 
| 18 R6 | 追加 | 
.setPrivileges*( privilege : Text ) : Boolean
.setPrivileges( privileges : Collection )
.setPrivileges( settings : Object ) : Boolean
| 引数 | 型 | 説明 | |
|---|---|---|---|
| privilege | Text | -> | アクセス権の名称 | 
| privileges | Collection | -> | アクセス権の名称のコレクション | 
| settings | Object | -> | "privileges" プロパティ (文字列またはコレクション) を持つオブジェクト | 
| 戻り値 | Boolean | <- | 実行が正常に終わった場合には true | 
説明
この関数は、リモートクライアント、ストアドプロシージャー、およびスタンドアロンのセッションでは何もせず、常に false を返します。
.setPrivileges() 関数は、引数として渡したアクセス権やロールをセッションと紐づけ、実行が成功した場合に true を返します。
- 
privilege には、アクセス権の名称を文字列として渡します (複数の場合はカンマ区切り)。 
- 
privileges には、アクセス権の名称を文字列のコレクションとして渡します。 
- 
settings には、以下のプロパティを持つオブジェクトを渡します: 
| プロパティ | 型 | 説明 | 
|---|---|---|
| privileges | Text または Collection | |
| roles | Text または Collection | |
| userName | Text | (任意) セッションと紐づけるユーザー名 | 
権限とロールは、プロジェクトの 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
参照
.storage
履歴
| リリース | 内容 | 
|---|---|
| 20 R5 | リモートクライアントとストアドプロシージャーセッションをサポート | 
| 18 R6 | 追加 | 
.storage* : Object
説明
.storage プロパティは、セッションのすべてのプロセスで利用可能な情報を保存しておける共有オブジェクトを格納します。
Session オブジェクトの作成時には、.storage プロパティは空です。 共有オブジェクトのため、このプロパティはサーバー上の Storage オブジェクトにおいて利用可能です。
サーバーの
Storageオブジェクトと同様に、.storageプロパティは常に "single" で存在します。 共有オブジェクトや共有コレクションを.storageに追加しても、共有グループは作成されません。
このプロパティは 読み取り専用 ですが、戻り値のオブジェクトは読み書き可能です。
セッションの.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コマンドで設定された名前が格納されています。
このプロパティは 読み取り専用 です。