LoginSignup
0
0

More than 1 year has passed since last update.

GeneXus Access Manager(GAM) #5 GAMを使用したメニューの定義・利用

Posted at

GeneXus Access Manager(GAM) #4 GAM Authorization にてGAMのAuthorizationの概要を確認ました。実行時のPermissionのチェックだけでなく、Permissionあるいはそれらを束ねたRollに基づいてメニューの出し分けをする機能が提供されているようです。

メニューの定義

にGAMBackendアプリでメニューデータを定義する方法が説明されています。
Settings > APPLICATIONS から
GAM01.JPG

アプリを指定してMenus と辿ってメニュー定義用の画面に遷移します。

GAM02.JPG

ざっくりいえば、MenusデータとOptionsデータに必要な内容を定義していくイメージです。Optionには起動するオブジェクトだけでなく、Menuデータを再帰的に定義できるので、サブメニュー等を表現できます。
上述したGAMBackendアプリケーションのメニュー:

  • USERS
  • ROLES
  • SETTINGS
    • SECURITY POLICIES
    • APPLICATIONS
    • REPOSITORY CONFIGURATIONS
    • ・・・

自体が GAMのメニューで定義されていますのでこれを見るとわかりやすいです。
GAM03.JPG

GAMBackendMainMenuのOptionsは以下のOptionを含み、UsersとRolesのTypeがSimple、SettingsのTypeがMenuになっていることが見て取れます。
GAM04.JPG

Users、Settingsの定義内容をそれぞれ見てみるとOption TypeがSimpleであるUsersの方は呼び出すResourceと許可するPermissionを、Option TypeがMenuであるSettingsの方は、上のMenusの一覧に表示されていた別のメニュー(GAMBackendSettingsMenu)を指定しています。
GAM05.JPG

Usersの方のResource呼び出しですが、GeneXus Access Manager(GAM) #4 GAM Authorization で見ました「実行時の自動的チェック」の仕組みでResource(Webパネルとか)側に定義された必要Permission(Permission Prefixプロパティ)により、遷移させてチェックするのでもよいのでしょうが、ここにPermissionを定義することで、メニュー自体の出し分けに使える(後述)ものと理解。
あとResource Parametersが定義できるようで、同じResourceを別パラメータで別メニューに定義して呼び出し時の挙動制御に使えそうですね。

メニュー表示概要

↓こちらでは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データ

Menuデータは以下のようにしました。
GAM06.JPG

ApplicationのMain Menuは、WpAuthXXに設定します。
GAM07.JPG

WpAuthXXのOptionsにはType=MenuでWpAuth0XとWpAuth1Xをぶら下げます。
GAM08.JPG
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

ユーザ毎の画面の見え方

GAM10.JPG

2021年08月06日 初版

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0