midPoint 4.0の新機能Archetype（アーキタイプ）で管理画面をカスタマイズする

# はじめに
midPoint by OpenStandia Advent Calendar 2019 の21日目は、midPoint4.0から導入された新機能【**Archetype（アーキタイプ）**】を利用して管理画面をカスタマイズするために考慮すべきポイントを紹介しようと思います。

# Archetype（アーキタイプ）とは
Archetype（アーキタイプ）は、端的に言うのであれば「midPointが管理するデータや設定情報を**区別するタグ**のような役割をするオブジェクト」です。

## アーキタイプの誕生の背景

Evolveum社のBlog[「Road To Archetypes」](https://evolveum.com/road-to-archetypes/)で語られている内容を元に、ID管理システムで管理すべきデータモデルをmidPointではどのように提供しているのか、その進化の過程を簡単に解説しながらアーキタイプの誕生の背景について紹介しようと思います。

2000年代初期のID管理システムは管理すべきデータモデルが整理されておらず、機能の大部分にハードコーディングされているなどメンテナンス性が良くないという課題がありました。

そのような過去の失敗からmidPointは、ID管理システムにおいて管理すべきデータモデルを「UserType（ユーザー）」、「RoleType（ロール）」、「OrgType（組織）」、「ServiceType（サービス）」の4つに集約して提供するという対応がなされました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221324/0958abf6-b284-2422-7185-6315820ad2c5.png)

実際のデータを表現するには、このデータモデルをさらにグループ分けしていきます。

 * UserType（ユーザー）であれば、正社員、派遣社員、協力会社社員など
 * OrgType（組織）であれば、会社、部門、課、チーム、プロジェクトなど
 * RoleType（ロール）であれば、ビジネスロール、プロジェクトロール、役割ロール（WF承認者ロール・代理承認者ロール）など
 * ServiceType（サービス）であれば、ユーザーが利用する開発PC、携帯端末、プリンターなど

このグループ分けを行うために、midPointはデータモデルの区別に利用する属性**Subtype(サブタイプ)**の導入へと進化することになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221324/db2f1ac3-ed1e-ca7a-dedc-028911c3c956.png)

サブタイプの導入により「正社員に共通した役割ロールを自動アサインする」といったポリシー適用を行うために、UserTypeの属性subtype（=正社員）を判定条件とするポリシー設定を容易に行えるようになりました。

しかし、正社員に最適なUIを提供することが難しいという課題が残りました。
そこでmidPointの[「メタロールの概念（※）」](https://wiki.evolveum.com/display/midPoint/Roles%2C+Metaroles+and+Generic+Synchronization#Roles,MetarolesandGenericSynchronization-Metarole)をデータモデルの区別に利用するアイデアを取り込んだ**アーキタイプ**の誕生です。
※メタロールの概念については、[midPointアドベントカレンダー6日目](https://qiita.com/zakiyamac09/items/f95a013a06152248a2b6#%E3%83%A1%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%AB)でも紹介されていますので、ここでは説明を省略します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221324/6d098a9e-e5fd-52cd-550f-1b545781f759.png)

後半では、アーキタイプを利用した管理画面のカスタマイズ方法をご紹介しようと思います。


# アーキタイプの利用実践

アーキタイプの利用実践として、管理画面のカスタマイズ方法として「独自アーキタイプを利用した方法」と「標準アーキタイプを利用した方法」の2つを紹介します。

## カスタマイズの概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221324/7247880a-696d-ec6b-5ca1-2e5a7bb1b76b.png)

| No. | カスタマイズ方法 | シナリオ | カスタマイズ内容 |
|:---|:---|:---|:---|
| シナリオ① | 独自アーキタイプを利用した方法 | 正社員のみ表示する画面を追加する | * 独自アーキタイプの登録<br/>* Object Collection（オブジェクトコレクション）の定義にアーキタイプを設定<br/>* 正社員用画面を追加 |
| シナリオ② | 標準アーキタイプを利用した方法 | マネージャーが過去に承認・却下したワークフロー申請を確認する画面を追加する | * 標準アーキタイプ（Approval Case）を設定し、かつ、データ抽出条件を追加したオブジェクトコレクションを登録<br/>* 自分の承認履歴画面を追加 |


midPointでは、下表のような標準アーキタイプを初期データとして用意しています。

* 標準アーキタイプ

| 名称 | 対応するObjectType | 説明 |
|:---|:---|:---|
| System User | UserType | システムが機能するために必要な非個人ユーザーのアーキタイプ。システム管理者など。 |
| System Role | RoleType | システムにおける標準ロールのアーキタイプ。管理者ロールや承認者ロールなど。 |
| Business User | RoleType | アサイン要求によるワークフロー申請・承認プロセスを使用して、ユーザーにアサインされるロールのアーキタイプ。 |
| Manual Provisioning Case | CaseType（※） | 手動のプロビジョニング操作を必要とするケースのアーキタイプ。 |
| Operation Request | CaseType（※） | ワークフロー申請内容のケースのアーキタイプ。 |
| Approval Case | CaseType（※） | ワークフロー承認依頼のケースのアーキタイプ。 |

※CaseType（ケースタイプ）とは、ワークフロー申請の承認を行う際に承認者が参照する「申請内容」や「承認依頼」など、「人が意思決定するための情報を表すデータモデル」です。


## 事前準備

事前準備として、「テストデータとして組織と所属ユーザーの登録」、および、「ワークフロー申請・承認の設定（※）」が完了していること。
※ワークフロー申請・承認の設定については、[midPointアドベントカレンダー9日目](https://qiita.com/n1330/items/6e149ec6331b58670548)を参照

### 登録するテストデータの内容

  * マネージャー：部署に所属する正社員、メンバーからの申請を承認可能なユーザー
  * メンバー：部署に所属する正社員、自身だけでなく、他メンバーの属性の登録・変更・削除の申請が可能なユーザー
  * 派遣社員：部署に所属する派遣社員、自身の属性の参照、および、パスワード変更が可能なユーザー

| 分類 | 名称 | 説明 |
|:---|:---|:---|
| マネージャー | mng0001 (管理五郎) | 開発部のマネージャー |
| メンバー | test0001 (野村太郎) | 開発部に所属するメンバー |
| メンバー（派遣社員） | test0010 (派遣花子) | 開発部に所属する派遣社員 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221324/1ba72a3b-72cc-a555-6773-8503d97c51bd.png)

* 組織ツリー画面でテストデータは、以下のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221324/663017f5-ce03-f30b-cecc-3dd292e4df33.png)


### シナリオ①：独自アーキタイプを利用した管理画面のカスタマイズ

正社員のみを表示する画面を追加する設定は、以下のとおり。

* 設定内容
  1. 独自アーキタイプ（正社員）と（派遣社員）を定義する
  2. ユーザーにアーキタイプをアサインする
  3. `システム設定`へカスタマイズ画面（正社員用画面）の定義を追加する

* アーキタイプ（正社員）を定義する

```xml:ArcheType-employee.xml
<?xml version="1.0" encoding="UTF-8"?>
<archetype oid="NRI00000-0000-0000-0000-000000000301"
           xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
           xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
           xmlns:org="http://midpoint.evolveum.com/xml/ns/public/common/org-3">
	<name>employee</name>
	<archetypePolicy>
		<display>
			<label>正社員</label>
			<pluralLabel>正社員</pluralLabel>
			<icon>
				<cssClass>fa fa-male</cssClass>
				<color>blue</color>
			</icon>
		</display>
	</archetypePolicy>
	<assignment>
		<assignmentRelation>
			<holderType>UserType</holderType>
		</assignmentRelation>
	</assignment>
	<inducement>
		<targetRef relation="org:default" type="RoleType">
		<filter>
			<q:equal>
				<q:matching>polyStringOrig</q:matching>
				<q:path>name</q:path>
				<q:value>End user</q:value>
			</q:equal>
		</filter>
		</targetRef>
	</inducement>
</archetype>
```

* アーキタイプ（派遣社員）を定義する

```xml:ArcheType-temporary-staff.xml
<?xml version="1.0" encoding="UTF-8"?>
<archetype oid="NRI00000-0000-0000-0000-000000000302"
           xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
           xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
           xmlns:org="http://midpoint.evolveum.com/xml/ns/public/common/org-3">
	<name>temporary-staff</name>
	<archetypePolicy>
		<display>
			<label>派遣社員</label>
			<pluralLabel>派遣社員</pluralLabel>
			<icon>
				<cssClass>fa fa-male</cssClass>
				<color>green</color>
			</icon>
		</display>
	</archetypePolicy>
	<assignment>
		<assignmentRelation>
			<holderType>UserType</holderType>
		</assignmentRelation>
	</assignment>
	<inducement>
		<targetRef relation="org:default" type="RoleType">
		<filter>
			<q:equal>
				<q:matching>polyStringOrig</q:matching>
				<q:path>name</q:path>
				<q:value>End user</q:value>
			</q:equal>
		</filter>
		</targetRef>
	</inducement>
</archetype>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221324/0d8a2fe4-1d3b-9df3-ed4f-c1c3a1c95868.png)

* ユーザーにアーキタイプをアサインする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221324/73b100cb-5a0d-dbc8-e7cb-f8030f4ea719.png)


* `システム設定`へカスタマイズ画面（正社員用画面）の定義を追加する

```xml:SystemConfiguration.xml(抜粋)
<adminGuiConfiguration>
	<objectCollectionViews>
<!-- 省略 -->
		<objectCollectionView>
			<identifier>employee-view</identifier>
			<display>
				<label>正社員</label>
				<pluralLabel>正社員</pluralLabel>
			</display>
			<type>UserType</type>
<!-- アーキタイプ（正社員）を指定 -->
			<collection>
				<collectionRef oid="NRI00000-0000-0000-0000-000000000301" relation="org:default" type="c:ArchetypeType"/>
			</collection>
		</objectCollectionView>
	</objectCollectionViews>
</adminGuiConfiguration>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221324/b5ef27ed-e1bd-ef45-2921-5c0e0c6ba4d6.png)


### シナリオ②：標準アーキタイプを利用した管理画面のカスタマイズ

標準アーキタイプ「Approval Case」を利用して、自分の承認履歴を表示する画面を追加する設定は、以下のとおり。

* 設定内容
  1. 表示したいデータの抽出条件を定義した`オブジェクトコレクション`を定義する
  2. `システム設定`へカスタマイズ画面（自分の承認履歴画面）の定義を追加する
  3. 画面表示に必要なObjectTypeの参照権限を追加する（標準ロール(Approver)の内容を修正）


* 表示したいデータの抽出条件を定義した`オブジェクトコレクション`を定義する

```xml:ObjectCollection-myapproval-history.xml
<?xml version="1.0" encoding="UTF-8"?>
<objectCollection oid="NRI00000-0000-0000-0000-000000000801"
    xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
    xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
    xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3"
    xmlns:org="http://midpoint.evolveum.com/xml/ns/public/common/org-3"
    xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
    xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3"
    xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3">
    <name>myapproval-history</name>
    <description>自分が承認/却下してWF申請が完了しているCaseTypeを抽出することで、自分の承認履歴を抽出する定義</description>
    <type>CaseType</type>
    <filter>
        <q:and>
            <q:ref>
                <q:path>workItem/performerRef</q:path>
                <expression>
                    <script>
                        <code>
                            import com.evolveum.midpoint.xml.ns._public.common.common_3.*
                            new ObjectReferenceType().oid(midpoint.principalOid)
                        </code>
                    </script>
                </expression>
            </q:ref>
            <q:equal>
                <q:path>state</q:path>
                <q:value>closed</q:value>
            </q:equal>
        </q:and>
    </filter>
    <baseCollection>
<!-- 標準アーキタイプ（Approval case）を指定 -->
       <collectionRef oid="00000000-0000-0000-0000-000000000342" relation="org:default" type="c:ArchetypeType"/>
    </baseCollection>
</objectCollection>
```

* `システム設定`へカスタマイズ画面（自分の承認履歴画面）の定義を追加する

```xml:SystemConfiguration.xml(抜粋)
    <adminGuiConfiguration>
        <objectCollectionViews>
<!-- 省略 -->
            <objectCollectionView>
                <identifier>my-approval-history</identifier>
<!-- メニューのラベル、ツールチップに表示する文字列を定義 -->
                <display>
                    <label>自分の承認履歴</label>
                    <pluralLabel>自分の承認履歴</pluralLabel>
                    <singularLabel>自分の承認履歴</singularLabel>
                    <tooltip>Approval cases</tooltip>
                </display>
                <displayOrder>1002</displayOrder>
<!-- メニューを追加するObjectType（CateType）を指定 -->
                <type>CaseType</type>
<!-- データの抽出条件を定義したオブジェクトコレクションを指定 -->
                <collection>
                    <collectionRef oid="NRI00000-0000-0000-0000-000000000801" relation="org:default" type="c:ObjectCollectionType">
                    </collectionRef>
                </collection>
            </objectCollectionView>
       </objectCollectionViews>
    </adminGuiConfiguration>
```

* 画面表示に必要なObjectTypeの参照権限を追加する（標準ロール(Approver)の内容を修正）

```xml:RoleType-approver.xml(抜粋)
<authorization>
   <name>gui-approver-access</name>
   <action>http://midpoint.evolveum.com/xml/ns/public/security/authorization-ui-3#workItem</action>
   <action>http://midpoint.evolveum.com/xml/ns/public/security/authorization-ui-3#myWorkItems</action>
   <action>http://midpoint.evolveum.com/xml/ns/public/security/authorization-ui-3#claimableWorkItems</action>
   <action>http://midpoint.evolveum.com/xml/ns/public/security/authorization-ui-3#userDetails</action>
   <action>http://midpoint.evolveum.com/xml/ns/public/security/authorization-ui-3#roleDetails</action>
   <action>http://midpoint.evolveum.com/xml/ns/public/security/authorization-ui-3#orgUnit</action>
   <action>http://midpoint.evolveum.com/xml/ns/public/security/authorization-ui-3#service</action>
<!-- メニューを表示するために追加 -->
   <action>http://midpoint.evolveum.com/xml/ns/public/security/authorization-ui-3#casesAll</action>
</authorization>
<authorization>
  <name>cases-read</name>
  <action>http://midpoint.evolveum.com/xml/ns/public/security/authorization-model-3#read</action>
  <object>
    <type>CaseType</type>
  </object>
<!-- 過去のWF申請/承認結果を参照するために削除
        <item>requesterRef</item>
        <item>approvalContext</item>
-->
</authorization>
<authorization>
  <name>archetypes-read</name>
  <action>http://midpoint.evolveum.com/xml/ns/public/security/authorization-model-3#read</action>
<!-- アーキタイプとオブジェクトコレクションへ参照権限を追加 -->
  <object>
   <type>ArchetypeType</type>
  </object>
  <object>
    <type>ObjectCollectionType</type>
  </object>
</authorization>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221324/eaf86a03-694a-9bba-9867-a30d52c42a66.png)


# まとめ

アーキタイプは、ユーザーの画面表示制御の設定やユーザー・組織などのグループ毎にポリシー設定を行う際の起点となるオブジェクトとして利用する事がポイントだと思います。

Evolveum社のWiki[「Archetype Improvements (Planned Feature)」](https://wiki.evolveum.com/pages/viewpage.action?pageId=27361684)を確認すると、アーキタイプの改善として今後さらにサポートされる機能が増えていくようなので、乞うご期待です。

* アーキタイプの改善として将来的にサポートされる機能

| 機能 | 内容 |
|:---|:---|
| UIカスタマイズ | アーキタイプ毎に管理画面（ダッシュボード、メニューなど）をカスタマイズできる |
| アーキタイプ・スキーマ | アーキタイプにカスタムスキーマを定義できる |
| カスタム・ライフサイクル | アーキタイプ毎にデータモデルのライフサイクルを定義できる |
| アーキタイプ導入対象オブジェクトの追加 | リソースやタスクなどにもアーキタイプが導入される |
| `assignmentRelation`の完全サポート | ロールと同レベルの設定に対応する |
| アーキタイプ管理画面のUI改善 | アーキタイプ定義を管理するための画面の導入される |
| メタ・アーキタイプ | アーキタイプのアーキタイプが定義できる |
| アーキタイプ関連のUX改善 | アーキタイプのアイコンや色の適用範囲が拡大される |


# 参考

* [Road To Archetypes](https://evolveum.com/road-to-archetypes/)
* [Archetypes](https://wiki.evolveum.com/display/midPoint/Archetypes)
* [Archetype Configuration](https://wiki.evolveum.com/display/midPoint/Archetype+Configuration)
* [Archetype Improvements (Planned Feature)](https://wiki.evolveum.com/pages/viewpage.action?pageId=27361684)
* [Roles, Metaroles and Generic Synchronization](https://wiki.evolveum.com/display/midPoint/Roles%2C+Metaroles+and+Generic+Synchronization#Roles,MetarolesandGenericSynchronization-Metarole)
* [midPointアドベントカレンダー6日目「midPointにおける「エンタイトルメント管理」「ポリシーとロール管理」実践編」](https://qiita.com/zakiyamac09/items/f95a013a06152248a2b6#%E3%83%A1%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%AB)