GeneXus Access Manager(GAM) #4 GAM Authorization にてGAMのAuthorizationの概要を確認ました。実行時のPermissionのチェックだけでなく、Permissionあるいはそれらを束ねたRollに基づいてメニューの出し分けをする機能が提供されているようです。
メニューの定義
にGAMBackendアプリでメニューデータを定義する方法が説明されています。
Settings > APPLICATIONS から
アプリを指定してMenus と辿ってメニュー定義用の画面に遷移します。
ざっくりいえば、MenusデータとOptionsデータに必要な内容を定義していくイメージです。Optionには起動するオブジェクトだけでなく、Menuデータを再帰的に定義できるので、サブメニュー等を表現できます。
上述したGAMBackendアプリケーションのメニュー:
- USERS
- ROLES
- SETTINGS
- SECURITY POLICIES
- APPLICATIONS
- REPOSITORY CONFIGURATIONS
- ・・・
自体が GAMのメニューで定義されていますのでこれを見るとわかりやすいです。
GAMBackendMainMenuのOptionsは以下のOptionを含み、UsersとRolesのTypeがSimple、SettingsのTypeがMenuになっていることが見て取れます。
Users、Settingsの定義内容をそれぞれ見てみるとOption TypeがSimpleであるUsersの方は呼び出すResourceと許可するPermissionを、Option TypeがMenuであるSettingsの方は、上のMenusの一覧に表示されていた別のメニュー(GAMBackendSettingsMenu)を指定しています。
Usersの方のResource呼び出しですが、GeneXus Access Manager(GAM) #4 GAM Authorization で見ました「実行時の自動的チェック」の仕組みでResource(Webパネルとか)側に定義された必要Permission(Permission Prefixプロパティ)により、遷移させてチェックするのでもよいのでしょうが、ここにPermissionを定義することで、メニュー自体の出し分けに使える(後述)ものと理解。
あとResource Parametersが定義できるようで、同じResourceを別パラメータで別メニューに定義して呼び出し時の挙動制御に使えそうですね。
メニュー表示概要
- JSCookMenu ユーザーコントロールを使用して GAM メニューを表示する方法 (wiki.genexus.jp)
- Howto: Display a GAM Menu using Jscookmenu UC (wiki.genexus.com)
↓こちらではTreeViewユーザーコントロールを使用した説明になっていますね。
使用しているGeneXus17のTrialではTreeViewユーザーコントロールがデフォルトで使えるのでこちらで確認してみます。
TreeView ユーザコントロール
Webパネル等にこのユーザコントロールを適用しますと、必要なSDT(TreeNodeCollection)がナレッジベースにインポートされて、当該WebパネルではそれをTypeに持った変数、及びEventにサンプルコードが設定されます。ドキュメントもありますね。
なのでGAMのAPIでメニューデータを取り(その際Permissionによるフィルタをかけ、権限のないメニューを取ってこない)、それをTreeNodeCollectionに設定するということですね。
メニュー表示実機検証
上掲のcollabo DBでは1つのMenuとその直下にぶら下がるOptionsの簡易な例ですので、ここではまずMain Menuを取り、その配下はOption TypeがMenuである再帰的な構造も含めてTreeViewユーザコントロール用のTreeNodeCollectionに移送する検証を行います。
取得するMenu/Optionsデータ
ApplicationのMain Menuは、WpAuthXXに設定します。
WpAuthXXのOptionsにはType=MenuでWpAuth0XとWpAuth1Xをぶら下げます。
WpAuth0XとWpAuth1XのOptionsにはType=Simpleで、個別の画面WPAuth00/01/02、WpAuth10/11/12をそれぞれ設定。Permissionとして、0X系のMenuにはwpauth0x_Execute、1X系のMenuにはwpauth1x_Executeを設定。
User データ
testuser00にはwpauth0x_Execute、wpauth1x_Executeの両方を、testuser10にはwpauth1x_Executeのみ付与し、ログイン時に表示されるメニューの差異を確認します。
処理
上掲collabo DBの例では
&GAMApplicationMenuCollection = &GAMApplication.GetMenus(&GAMApplicationMenuFilter,&GAMErrors)
&GAMApplicationMenu = &GAMApplicationMenuCollection.Item(1)
として、&GAMApplicationMenuCollectionの1つ目の要素について処理をしています。&GAMApplicationMenuのコレクションをGetMenusで取りますと、そのGAMApplication配下のMenuが全て(本来他のMenuの配下にぶら下がるMenuも)取れてしまいます。1つ目がMainという決め、というのも何ですので、上記で設定しましたApplicationのMain Menu属性を利用して、以下のようにしてみました。
// Get Application
&GAMApplication = GAMApplication.Get()
// Get Main Menu
&GAMApplicationMenu = &GAMApplication.GetMenu(&GAMApplication.MainMenuId, &GAMErrorCollection)
あとはメニューのオプション(GAMMenuOptionList)を取得していきますが、これはGAMOptionList.Nodes(GAMOptionListのコレクション)を再帰的に持ちます。これをTreeViewのTreeNodeCollectionに移送するために以下のようなProcedure(PrGAMMenuOptionToTreeNode(inGAMMenuOptionListNodes : GAMMenuOptionListのコレクション, outTreeNode : TreeNodeのコレクション )を作成しました。
For &GAMMenuOptionList In &inGAMMenuOptionListNodes
&treeNode = New()
&treeNode.Id = &GAMMenuOptionList.Id.ToString()
&treeNode.Name = &GAMMenuOptionList.Name
&treeNode.Link = &GAMMenuOptionList.Link
If &GAMMenuOptionList.Nodes.Count > 0
&treeNode.Nodes = PrGAMMenuOptionToTreeNode.Udp(&GAMMenuOptionList.Nodes)
EndIf
&outTreeNodeCollection.Add(&treeNode)
EndFor
これの呼び出しを先程のMain Menu取得後に加え、全体(とりあえずStart Eventに詰め込んでます)としては以下のように。
Event Start
// Get Application
&GAMApplication = GAMApplication.Get()
// Get Main Menu
&GAMApplicationMenu = &GAMApplication.GetMenu(&GAMApplication.MainMenuId, &GAMErrorCollection)
&GAMMenuOptionList = GAMRepository.GetApplicationMenu(&GAMApplication.GUID, &GAMApplicationMenu.GUID, &GAMErrorCollection)
&treeNode = new()
&treeNode.Id = &GAMMenuOptionList.Id.ToString()
&treeNode.Name = &GAMMenuOptionList.Name
&treeNode.Nodes = PrGAMMenuOptionToTreeNode.Udp(&GAMMenuOptionList.Nodes)
&treeNodeCollectionData.Add(&treeNode)
EndEvent
ユーザ毎の画面の見え方
2021年08月06日 初版