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

デスクトップセッション

デスクトップセッション とは、4D Server または4D シングルユーザー版のユーザー関連の実行コンテキストであり、Web やREST アクセスに起因するものではないものです。

Web ユーザーセッション 同様、デスクトップセッションで実行されたコードはSession オブジェクトへのアクセスが可能で、これによって提供される関数やプロパティによって(例えばsession.storage オブジェクトを使用することによって)セッションの値を保存したりユーザープロセス間で共有することが可能になります。

しかしながら、Web ユーザーセッション内で実行されたコードとは違い、デスクトップセッション内で実行されたコードはロールと権限によっては管理されません。 これはORDA およびデータモデルクラスを含め、4D アプリケーションのどの部分へもアクセスすることができます。 4D Server 上では、ユーザー&グループ機能 でユーザーアクセスを管理することができます。

それでも、デスクトップセッションをWeb セッションと共有 すること ことができ、これによってデスクトップユーザーは、例えばQodly ページとWeb エリアを使用して、Web インターフェースを通して4D アプリケーションへとアクセスうすることができます。

セッションの種類

デスクトップセッションには以下のような種類が含まれます:

  • リモートユーザーセッション: クライアント/サーバーアプリケーションにおいては、サーバー上でユーザープロセスを管理するセッション。
  • ストアドプロシージャーセッション: クライアント/サーバーアプリケーションにおいては、サーバー上で実行される全てのストアドプロシージャーを管理する固有のバーチャルユーザーセッション。
  • スタンドアロンセッション: シングルユーザーアプリケーション内で返されるローカルセッションオブジェクト(クライアント/サーバーアプリケーションの開発およびテストフェーズにおいて有用です)。

スケーラブルセッション 有効化されているときに、4D プロジェクトがWeb またはREST 経由でアクセスがあれば、すぐにWeb セッション が使用されるという点に注意してください。

以下の図は、異なるセッションの種類とそれらがどのように関連するかを表しています:

リモートユーザーセッション

サーバー上では、"ユーザープロセス"(つまりリモートユーザーに関連したプロセス)内では、Session コマンドはカレントのユーザーセッションを表す session オブジェクトを返します。 このオブジェクトを扱うには、Session クラス の関数とプロパティを使用します。

リモート4D 上では、 Session コマンドは必ず null を返します。

効果

session オブジェクトを使用すると、リモートユーザーセッションに関する情報や権限を管理できます。

ユーザーセッションのすべてのプロセス間でデータを共有するには、Session.storage 共有オブジェクトを使用できます。 たとえば、クライアントがサーバーに接続する際にユーザー認証手続きを開始し、メールや SMS で送信されたコードをアプリケーションに入力させることができます。 次に、ユーザー情報をセッションの storage に追加し、サーバーがユーザーを識別できるようにします。 この方法により、4Dサーバーはすべてのクライアントプロセスのユーザー情報にアクセスできるため、ユーザーの役割に応じてカスタマイズされたコードを用意することができます。

また、リモートユーザーセッションに権限を割り当てることで、Webエリア内で実行されているQodly ページからセッションがきている場合にアクセスを管理することができます。

利用可能性

リモートユーザー Session オブジェクトは以下から利用できます:

ストアドプロシージャーセッション

サーバー上では、全てのストアドプロシージャー は同じバーチャルユーザーセッションを共有します。

効果

ストアドプロシージャーセッションのすべてのプロセス間でデータを共有するには、Session.storage 共有オブジェクトを使用できます。

利用可能性

ストアドプロシージャーの session オブジェクトは、次のいずれかから利用できます:

スタンドアロンセッション

スタンドアロンセッションとは、4D をローカルに使用している際に実行されるシングルユーザーセッションのことです。

効果

スタンドアロンセッションでも、Web セッションと OTP 共有を使用することでクライアント/サーバーアプリケーションの開発とテストを行うことができます。 スタンドアロンセッション内のコードでも、リモートセッションにおける session オブジェクトと同じように session オブジェクトを使用することができます。

利用可能性

スタンドアロンの session オブジェクトは4D アプリケーション上で実行される全てのメソッドとコードから利用することが可能です。

Webアクセスのためにデスクトップセッションを共有する

デスクトップセッションを使用して、同じユーザーによるアプリケーションへのWeb アクセスを管理し、それによって 権限 を管理することができます。 これは、リモートマシン上で実行中の、 Qodly pages がインターフェースとして使用されているクライアント/サーバーアプリケーションにおいて特に有用です。 この構成では、アプリケーションは現代的なCSS ベースのWeb インターフェースを持ちながらも、統合されたクライアント/サーバーのパワーと単純さの恩恵に預かることができます。 このようなアプリケーションでは、Qodly ページは標準の4D Web エリア内で実行されます。

このような構成を製品において管理するためには、リモートユーザーセッションが必要です。 実は、リモート4D アプリケーションとWeb エリアにロードされたQodly ページの両方からリクエストが来る場合には、これらは同じセッション内で動作する必要があります。 リクエストがどこから来ているか(Web またはリモート4Dか)に関わらず、リモートクライアントとWeb ページが同じセッション storage とクライアントライセンスを持つように、リモートクライアントとWeb ページ間でセッションを共有するようにするだけです。

この場合、ユーザーがWeb アクセスに対して持っている権限を自動的に取得できるように、Web リクエストをWeb エリアから実行する前にセッション内に権限 を設定するべきであるという点に注意してください(例題参照)。 ただし権限はWeb から来るリクエストに対してのみ適用されるという点に注意してください。

この設定は、4D Developer アプリケーション(シングルユーザー)で開発することができます: standalone session を使用して、Web アクセスに関連した全ての機能のコードを書いてテストすることができます。アプリケーションの運用がシングルユーザー向けかクライアント/サーバー向けかは関係ありません。

共有セッションは OTPトークン を通して管理されます。 サーバー上またはシングルユーザー4D アプリケーション上のデスクトップセッション用の OTP トークンを作成した後、Qodly ページを格納しているWeb エリア(あるいは他のWeb ブラウザ)から送信されたWeb リクエストに($4DSID 引数値を通して)トークンを追加します。これによってサーバー上またはシングルユーザーアプリケーション上のユーザーセッションを特定して共有することができます。 Web サーバー側では、Web リクエストが $4DSID パラメーター内に OTP id を格納していた場合、そのOTP トークンに対応したセッションが使用されます。

クライアント/サーバー環境においてOTP トークンを作成する場合、OTP 作成コードサーバー上で 実行する必要があります(Session オブジェクトはリモート4D ではNull となります)。 たとえば On Server Open Connection データベースメソッドなどを使用することができます。

例題

フォーム内において、OTP を取得し、Web エリア内にQodly ページを開きます:

Form.otp:=getOTP

Form.url:="http://localhost/$lib/renderer/?w=Products&$4DSID="+Form.otp

WA OPEN URL(*; "QodlyPage"; Form.url)

getOTP プロジェクトメソッド(クライアント/サーバーでサーバー上で実行 付き):

// クライアント サーバー:
// ----------------
// セッションオブジェクトはサーバー上にあるため、メソッドはサーバー上で実行する必要がある
// セッションオブジェクトはクライアントでは常にNull
//

#DECLARE() : Text

return Session.createOTP()

"viewProducts" セッションに権限を付与するために使用されるコードは以下の通りになります:

// クライアント サーバー:
// ----------------
// セッションオブジェクトはサーバー上にあるため、メソッドはサーバー上で実行する必要がある
// セッションオブジェクトはクライアントでは常に Null

Session.clearPrivileges() // セッションから古い権限を消去する
Session.setPrivileges("viewProducts")