midPointにおける「アクセス要求」「ワークフロー」実践編

# はじめに

midPointアドベントカレンダー9日目は[昨日の記事](https://qiita.com/tama1/private/b1dde1573cd12810fb41)で紹介された「アクセス要求」「ワークフロー」について、実際のmidPointでの設定方法をご紹介します。

紹介する設定は、ユーザが必要なロールを自ら要求しアサインできるようにする設定や、ロールに対して承認者を設定しておき、ロールの要求後、その承認者による承認操作をもって要求したユーザにロールをアサインできるようにするといった内容になります。

また、ロールを管理する機能についても紹介します。

「アクセス要求」や「ワークフロー」の詳細については[昨日の記事](https://qiita.com/tama1/private/b1dde1573cd12810fb41)をご参照ください。

また、昨日の記事中でも触れられていますが、midPointではユーザの要求ベースのロールアサインの他に、予め定めておいたポリシー(アサインルール)に基づいて自動でロールを割当てる機能もあります。この機能については本アドベントカレンダーの[6日目](https://qiita.com/zakiyamac09/private/f95a013a06152248a2b6)、[7日目](https://qiita.com/n1330/private/4ffd7144369eb2d6df73)のmidPointにおける「エンタイトルメント管理」「ポリシーとロール管理」の記事をご参照ください。

今回、midPointは[midPointの公式Docker Hubリポジトリ](https://hub.docker.com/r/evolveum/midpoint/)で公開されているバージョン4.0.1の evolveum/midpoint:4.0.1 を使用しています。

# アクセス要求とワークフローの基本設定
## アクセス要求設定

[昨日の記事](https://qiita.com/tama1/private/b1dde1573cd12810fb41)でも触れられていますが、midPointではアサイン要求は`ロールの要求`という名前の機能で実現されています。

まずは単純に、ユーザがロールを要求し、その要求をもってそのユーザにロールをアサインできるようにする設定を説明します。

### 設定

はじめに、ロール要求を行うための、midPointへのアクセス権限をもつユーザを作成します。

![1-1testuser1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/0aded701-2cbe-f0a0-91bc-9f93eadd988e.png)
![1-1testuser2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/125c6f00-6aba-cf8e-2497-b505ee9a4012.png)


`End user`ロールは、midPointにデフォルトで用意されているmidPointの一般ユーザロールです。このロールをアサインすることで、midPointへのログインが可能となります。

次に、ユーザに要求を許可するロールを作成します。

![1-2role.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/9cedadf0-a853-9f69-edba-dcdb58a95873.png)

`要求可能`を`true`とすることで、ユーザからの要求ができるロールとなります。

要求可能なロールの準備はこれで完了です。

### 動作確認

先程作成した`test`ユーザで、実際にロール要求をして動作確認をしてみます。現時点では`test`ユーザにアサインされているロールは`End user`のみです。

![1-3assign.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/1d745433-1771-bbf3-213a-98d53cc748ba.png)

ロール要求は`ロールの要求`から行います。

![1-4requestrole.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/1bff47ac-d079-c04e-deed-b0a0a6e5e1e4.png)
![1-5requestrole.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/be6aae92-af6c-504c-6ba3-5c8c5663607e.png)
![1-5requestrole2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/86b7d500-1d8f-07a2-385f-3c5c83e37f4e.png)

先程作成した`ProjectA user`ロールが表示されていますので、選択しロールを要求します。ロール要求はECサイトでの買い物を模しており、選択したロールは`ショッピングカート`に入り、`ショッピングカート`から要求を確定するというUIになっています。なお、`ショッピングカートへ行く`ボタンだけではなくショッピングカートアイコンからでも`新規アサインの一覧`(ショッピングカートの中身)に遷移できます。

ロール要求が完了すると、`割当はすぐに使用できます。`となっているように、そのまま`test`ユーザに`ProjectA user`ロールがアサインされます。これは、現時点では承認が必要な設定をしていないためです。

ユーザプロファイルのアサイン画面でアサインされていることが確認できます。

![1-6role.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/5b49c5aa-0bf8-e72d-7244-f9a02c743075.png)

## ワークフローの設定

承認が不要なロールであれば上記の[アクセス要求設定](https://qiita.com/n1330/private/6e149ec6331b58670548#アクセス要求設定)の手順で設定できますが、承認者による承認を必要とするようにしたい場合も多いかと思います。ここでは、そのような承認が必要な要求可能ロールを作成する手順を説明します。

### 設定

設定方法を説明していきます。まず、承認者となるユーザを作成しておきます。

![2-1testuser1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/8d18464d-04f8-d0e7-3988-0306534cfb63.png)
![2-1testuser2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/428a4d69-8756-8dfe-5d67-8dd323025f57.png)


承認者には、`End user`ロールに加え、`Approver`(承認者)ロールをアサインしておきます。`Approver`ロールをアサインすることで下記のキャプチャのように、`End user`ロールだけの場合と違い、左部に`ケース`というメニューが表示されるようになります。

![2-2testuser.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/0f9afb6b-ae51-8385-9fb4-cb0b00d72be0.png)

承認者ユーザの用意ができたので、ロールを作成します。ロールは前述の[アクセス要求設定](https://qiita.com/n1330/private/6e149ec6331b58670548#アクセス要求設定)と同じように作成します。

![2-3role.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/2cea96cc-5398-d286-4caf-d133ef9fc1b0.png)

次に、作成したロールの承認者を設定します。承認者に設定したいユーザに`承認者`としてロールをアサインすることで、ロールの承認者として設定することができます。

![2-4assignrole.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/6acd7fdd-898e-d21c-cf99-dfd277088fbd.png)

これで設定は完了です。

### 動作確認

[アクセス要求設定の動作確認](https://qiita.com/n1330/private/6e149ec6331b58670548#動作確認)と同じように動作を確認していきます。[アクセス要求設定](https://qiita.com/n1330/private/6e149ec6331b58670548#アクセス要求設定)で作成した`test`ユーザで先ほど作成した`ProjectB user`ロールを要求してみます。

![2-5requestrole.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/d286514b-385e-dc58-33d7-b902dedeb9e2.png)
![2-5requestrole2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/2ba0774b-6f5a-5caf-3eb9-0e1313a486eb.png)
![2-5requestrole3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/42f1c185-a89f-082e-ba9b-82c58e32a3a4.png)

今度は[アクセス要求設定](https://qiita.com/n1330/private/6e149ec6331b58670548#アクセス要求設定)の際とは違い、要求しただけではロールがアサインされず、進行中といったメッセージが表示されました。

承認者に設定した`testapprover`ユーザでログインしてみます。

![2-6approver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/1e79ce68-c84e-5a0e-0336-f89dc46db94d.png)

midPointでは承認タスクは`作業アイテム`と言う名前で扱われます。トップページにて、承認依頼として`作業アイテム`が来ていることやメニューの`ケース`にバッチがついていることが確認できます。`作業アイテム`の名前を選択すると、詳細が確認できます。なお、`ケース`からでも`作業アイテム`画面に行くことができます。

![2-7approve.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/0920a9df-3084-3d4e-81ca-5141003e40a2.png)

先ほど`test`ユーザで要求したロールの承認依頼であることが確認できますので、承認します。

再度`test`ユーザでログインすると、`ProjectB user`がアサインされていることが確認できます。

![2-8role.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/d38dcfdd-d0c4-8170-f910-4665af518d95.png)

# アクセス要求対象のロールの管理

ここまでで、アクセス要求(ロールの要求)とワークフローの基本的な設定をご紹介しました。

しかし、ここまでの設定内容だけでは、ロールが横並びとなってしまい、ロール数が増えると管理が難しくなります。また、ロール要求をするユーザも要求したいロールを`ロールの要求`画面から探すのが大変です。

ここでは、要求可能なロールを管理するための機能を少し説明します。

## ロールカタログ設定

1つ目はロールカタログです。ロールカタログは、ロールを階層管理する機能です。

![rolecatalog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/8574153d-d4d3-a460-c058-9c65eaf78651.png)

midPointでは、`組織構造`として、組織を階層管理する機能があります。ロールの管理においては、その組織にロールを割り当てることでロールの階層管理が実現できます。これをロールカタログと呼んでいます。

### 設定

ロールカタログの設定方法を見ていきます。まず、ロールカタログとする組織を作成します。

![3-1rolecatalog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/c81d1d46-8387-9bd8-5793-0b84c3cdf159.png)

子組織として[アクセス要求設定](https://qiita.com/n1330/private/6e149ec6331b58670548#アクセス要求設定)と[ワークフロー設定](https://qiita.com/n1330/private/6e149ec6331b58670548#ワークフローの設定)で作成したロール用の組織を作ります。

![3-2childorg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/1df32d37-fc87-eb8b-09ae-a945eab3d8b6.png)
![3-2childorg2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/3264733c-f126-ca3e-0e2b-17f29676f130.png)

同様の手順で`ProjectB user`用の組織も作成しました。

![3-2childorg4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/56f22f5e-73af-0479-d720-190f9a2d4cec.png)

作成した`ProjectA`に`ProjectA user`ロールを割り当てます。

![3-3prja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/8bbcddcf-539a-20f3-afa5-1822e59d6569.png)


`メンバー`内の`タイプ`を`ロール`または`すべて`にすることで、割り当てたロールが確認できます。

![3-3prja2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/88dca6d6-bfc8-8d66-680c-5ce898490cc3.png)

同様に`ProjectB`に`ProjectB user`ロールを割り当てました。

![3-4prjb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/aba0b917-6e57-da74-3585-4bf61cf7ef1b.png)

次に作成した組織をロールカタログに指定する設定です。`ロール管理`(システム > ロール管理)の`ロール・カタログへの参照`を先ほど作成した`ロールカタログ`組織にします。

![3-5rolecatalog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/c13e558b-666c-22c9-f667-970f4810484d.png)


これで、ロールカタログの設定は完了です。

### 動作確認

ロールカタログの確認をします。

ただし、midPointのデフォルトの`End user`ロールでは組織(OrgTypeオブジェクト)の参照権限がないため、階層化されたロールカタログが参照できません。

そのため、`End user`ロールに権限を付けておきます。`End user`ロールの編集画面の`RAWデータの編集`を選択してください。XMLの`role`タグ内に下記のOrgType参照権限設定を追加します。

![3-6enduser.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/f16af77c-ff7e-7d53-53a5-a163d657607f.png)
![3-7orgread.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/b8a67b8b-f244-b6a1-3a89-3233dc902cf5.png)

``` xml:組織参照権限設定
    <authorization>
        <name>orgtype-read</name>
        <action>http://midpoint.evolveum.com/xml/ns/public/security/authorization-model-3#read</action>
        <object>
            <type>OrgType</type>
        </object>
    </authorization>
```

これで、権限設定は完了です。

[アクセス要求設定](https://qiita.com/n1330/private/6e149ec6331b58670548#アクセス要求設定)で作成した`test`ユーザの`ロールの要求`画面に行くと、設定したロールカタログが確認できます。

![3-8orgcatalog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/96adef95-b236-1b2f-6130-5c15f67fc8a7.png)

## ロールの要求画面カスタマイズ

最後に`ロールの要求`画面のカスタマイズ方法をご紹介します。

先程説明したロールカタログの表示も`ロールの要求`画面のカスタマイズの一つですが、その他に`ロールの要求`画面上部の`すべてのロールの表示`などが表示されているタブも表示内容が変えられます。

設定は`システム`の`RAWデータの編集`から行います。XMLの`role`タグ内の`roleManagement`タグ内で以下の設定を行います。[ロールカタログ設定](https://qiita.com/n1330/private/6e149ec6331b58670548#ロールカタログ設定)を行っている場合は、`roleManagement`タグはすでにあるかと思いますので、そこを編集してください。ない場合は`roleManagement`タグを追加してください。

![4-1raw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/2c8a5a76-6f9f-9c77-fcc5-4f6bc9026b04.png)
![4-2requestroleraw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/98356325-fece-4669-e523-538b0f98320b.png)


``` xml:ロールの要求画面の設定
        <roleCatalogCollections>
            <collection>
                <collectionUri>http://midpoint.evolveum.com/xml/ns/public/common/object-collections-3#roleCatalog</collectionUri>
            </collection>
            <collection>
                <collectionUri>http://midpoint.evolveum.com/xml/ns/public/common/object-collections-3#allRoles</collectionUri>
            </collection>
        </roleCatalogCollections>
        <defaultCollection>
            <collectionUri>http://midpoint.evolveum.com/xml/ns/public/common/object-collections-3#roleCatalog</collectionUri>
        </defaultCollection>
```

この設定は、`ロールの要求`の上部のタブに`ロールカタログの表示`と`すべとのロールの表示`を表示し、`ロールの要求`へのアクセス時に表示する画面は`ロールカタログの表示`にするという設定内容になります。`roleCatalogCollections`タグが上部のタブに表示するボタン群の設定で、`defaultCollection`が`ロールの要求`へのアクセス時に表示する画面の設定です。

`test`ユーザで`ロールの要求`画面を確認すると以下のように想定どおりとなっていることが確認できます。

![4-3requestrole.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13224/c0ce8981-b07a-ecc8-6d47-ccd0f2d7e833.png)

その他のタブを含むタブの`collectionUri`の一覧は下記のとおりです。

|collectionUrl|タブ名|
|---|---|
|`http://midpoint.evolveum.com/xml/ns/public/common/object-collections-3#roleCatalog`|ロールカタログの表示|
|`http://midpoint.evolveum.com/xml/ns/public/common/object-collections-3#allRoles`|すべてのロールの表示|
|`http://midpoint.evolveum.com/xml/ns/public/common/object-collections-3#allOrgs`|すべての組織の表示|
|`http://midpoint.evolveum.com/xml/ns/public/common/object-collections-3#allServices`|すべてのサービスの表示|
|`http://midpoint.evolveum.com/xml/ns/public/common/object-collections-3#userAssignments`|ユーザのアサイン|

参考: [Role Request and Shopping Cart Configuration \- midPoint \- Evolveum Confluence](https://wiki.evolveum.com/display/midPoint/Role+Request+and+Shopping+Cart+Configuration)

# おわりに

今回は、アクセス要求とワークフローについて、midPointでの実際の設定方法をご説明しました。あわせて、要求可能とするロールを管理する機能にも触れました。

この他にも、midPointには、承認者に`作業アイテム`が振られた際に、メールなどで通知する機能等もあり、ID管理におけるアクセス要求やワークフローの基本的な機能は揃っているものと思います。

また、少し高度な設定(※)が必要になりますが、ロール管理という視点では、ロールカタログの組織の管理者を、そのロールカタログ内のロールの承認者にするといった設定も可能です。これにより、ロールの管理がより効率的に行なえます。

※ midPointの設定の管理ファイルであるXMLを編集する必要がありますが、設定内にGroovyやJavaScriptといったスクリプトを利用することができます。midPointはそれにより柔軟に動作をカスタマイズすることができます。

なお、ロールカタログ以外のロールの管理機能として、本アドベントカレンダーの6日目の[「midPointにおける「エンタイトルメント管理」「ポリシーとロール管理」を解説する」の「拡張されたロールベースアクセスコントロール（RBAC）」](https://qiita.com/zakiyamac09/items/f95a013a06152248a2b6#拡張されたロールベースアクセスコントロールrbac)でも触れられているように、ロールをアサインする際に組織などのパラメータを付与する仕組みもあります。

ロールカタログでは管理すべきロールの数は、[ロールカタログ設定](https://qiita.com/n1330/private/6e149ec6331b58670548#ロールカタログ設定)中の図のように、組織(プロジェクト等)の数×権限ロール(一般ユーザ、管理者ユーザ等)の数から変わりません。しかし、上記の機能では組織(プロジェクト等)の数+権限ロール(一般ユーザ、管理者ユーザ等)ですむことになります。


# 参考

[Approval \- midPoint \- Evolveum Confluence](https://wiki.evolveum.com/display/midPoint/Approval)
[Role Request and Shopping Cart \- midPoint \- Evolveum Confluence](https://wiki.evolveum.com/display/midPoint/Role+Request+and+Shopping+Cart)
[Role Catalog \- midPoint \- Evolveum Confluence](https://wiki.evolveum.com/display/midPoint/Role+Catalog)
[Role Catalog Configuration \- midPoint \- Evolveum Confluence](https://wiki.evolveum.com/display/midPoint/Role+Catalog+Configuration)
[Role Request and Shopping Cart Configuration \- midPoint \- Evolveum Confluence](https://wiki.evolveum.com/display/midPoint/Role+Request+and+Shopping+Cart+Configuration)
[Script Expression \- midPoint \- Evolveum Confluence](https://wiki.evolveum.com/display/midPoint/Script+Expression)