メインの SD オブジェクトの [ Auto-Register Anonymous User ] プロパティが True に設定されている場合に GAM を使用すると、このメインオブジェクトから呼び出されるオブジェクトの中で認証が必要な最初のオブジェクト ( [ Integrated Security Level ] プロパティ = Authentication または Authorization の最初のオブジェクト) に対し、まず匿名ユーザーとしての認証が試行されます。
このため、ダッシュボードメニューに含まれているオプションの中で認証を要するものはすべて、アプリケーションユーザーに匿名ユーザーとしてのアクセス権を与えることになります。
ここで解決すべき問題は、GAM に登録されているユーザーアカウント (匿名ユーザーとは異なるアカウント) でユーザーがログインすることが必須となっているアクションについては、どうするかということです。
このシナリオの例
解決すべき問題
以下に紹介するのは基本的なサンプルで、ある書店の最新刊、著者、著者の刊行本、文学スタイルの閲覧用アプリケーションです。
メインダッシュボードを用意し、上記の情報を表示する各オブジェクトを呼び出すさまざまな Action アイテムを定義します。
このアプリケーションにセキュリティ機能を持たせるため、次のようなバージョン設定を行います: [ Enable Integrated Security ] プロパティ = True
メイン ダッシュボード レベルでの設定は、次のようになります: [ Auto-Register Anonymous User ] プロパティ = True
図 1.
上記のように設定した場合、このダッシュボードの実行には認証が必要になりますが、 [ Auto-Register Anonymous User ] が True に設定されているため、最初に匿名ユーザーとしての認証が試行されます。
このため、ダッシュボードメニューに含まれているオプションの中で認証を要するものはすべて、アプリケーションユーザーに匿名ユーザーとしてのアクセス権を与えることになります。
さてここで、アプリケーションの中のあるアクションの実行に、匿名以外のユーザーアカウントでのユーザー認証が必要になる場合を想定してみます。ここでは、ユーザーが書籍の購入を希望している場合を考えてみましょう。
また、資格情報を入力してアプリケーションにアクセスすることをユーザーが希望している場合も、ダッシュボードにこのログインオプションを追加できます。ダッシュボードの GAMSDLogin アクションに、次のようなコードを関連付けます:
Event 'GAMSDLogin'
GAMSDLogin2()
EndEvent
解決方法
同じ問題の解決方法として考えられるものを 2 つ検討していきましょう。
1.まず 1 つ目の解決策として考えられるのは、アクセス許可を使用する方法です。
スマート デバイス アプリケーションで自動登録されたユーザーに、次のロールを (以下に説明する優先順序に従って) 自動的に割り当てます。
-
"Anonymous (匿名)" ユーザーに割り当てられているすべてのロール。図 2 を参照してください。
図 2.匿名ユーザーに割り当てられているロール
"Anonymous (匿名)" ユーザーは、Web アプリケーションでも SD アプリケーションでも同じです。
-
匿名ユーザーにロールが割り当てられていない場合は、リポジトリの既定ロールが割り当てられます。図 3 を参照してください。
図 3.GAM Web バックオフィスを使用したリポジトリ既定ロール ( [ Repository default role ] ) の設定
結果として、アプリケーションがアクセス許可を扱う場合で ( [ Integrated Security Level ] プロパティ = Authorization)、GAM アプリケーションがアクセス許可をチェックするように設定されているときは (アプリケーションの [ Require Access Permissions ] プロパティのチェックボックスが GAM Web バックオフィスでオンになっている場合)、匿名ユーザーに許可されているアクションと禁止されているアクションを、上述のロールにアクセス許可を割り当てる形で区別できます。
たとえば、ユーザーが書籍を定期購読または注文できるようにする場合、"書籍の購入" というアクション限定のアクセス許可がこのユーザーに割り当てられるように、ユーザーの本人確認を行う必要があります。
この例では、このアクションに、該当する操作を実行する REST Web サービスのアクセス許可が関連付けられています。以下は、"書籍の購入" アクションのコードです。
Event 'PurchaseBook'
PurchaseBook.Call(&sdtLiteraryStyle.CurrentItem.NovelId)
EndEvent
図 4.PurchaseBook プロシージャーの実行には "PurchaseBook" アクセス許可が必要
この例では、"PurchaseBook" アクセス許可を、図 5 に示すように、匿名ユーザーに割り当てられるロールに対しては制限 (Restricted) する必要があります。匿名ユーザーに割り当てられているロールが "Role1" の場合、"PurchaseBook" アクセス許可はそのロールに対して制限 (禁止) されます。詳細については、「ロールにアクセス許可を追加する方法」を参照してください。
図 5.匿名ユーザーロールに割り当てられているアクセス許可
2.アクセス許可の処理が好ましくない場合の別の方法として、次のようにユーザーをログイン ページにリダイレクトするプログラムを作成します:
Event 'PurchaseBook'
Composite
&objectInfo = CheckPermissionUser(&sdtLiteraryStyle.CurrentItem.NovelId)
call(&objectInfo)
EndComposite
EndEvent
CheckPermissionUser プロシージャーは、ユーザーが匿名ユーザーかどうかをチェックし、その結果に応じて呼び出されるプログラムの名前を変数に読み込みます。ユーザーが匿名ユーザーの場合、ログインアクションが呼び出され、匿名以外のユーザーの場合は、PurchaseBook プロシージャーが呼び出されます。この例では、動的呼び出しを実行します。
CheckPermissionUser プロシージャー:
if not &GAMSession.IsAnonymous
&objectInfo = "prc:PurchaseBook?"+&NovelId.ToString().Trim()
else
&objectInfo = "sd:Gamsdlogin2"
endif
代替コード:
Event 'PurchaseBook'
Composite
&isAnonymous = IsAnonymous() //call a procedure which returns a boolean variable
if &isAnonymous
GAMSDLogin2.Call()
&isAnonymous = IsAnonymous()
if not &isAnonymous
MySDPanel.Call()
endif
else
MySDPanel.Call()
endif
EndComposite
EndEvent
CheckPermissionUser プロシージャーのロジックの詳細については、「スマートデバイスでの動的な呼び出し」を参照してください。
参考情報
[ Auto-Register Anonymous User ] プロパティ
|