[OutSystems]User_RoleとUser_Effective_Role

OutSystemsのロールには、LifeTimeで管理するITユーザーのロールと、Usersアプリケーションで管理するエンドユーザーのロールがあります。
今回の話題は、エンドユーザーのロールについて。

「あるユーザーがあるロールを保持しているかどうか」は、Roleの下にある「Check\<Role名\>Role」Actionを使うのですが、(System)のEntityを使って判定することもできます。Entityを使うと、そのユーザーが保有するロールの一覧が取得できるのがいい点です。
このEntityには、User_RoleとUser_Effective_Roleがあります。それぞれの使い方を違いを確認していこうと思います。

# 確認環境
Personal Environment(Version 11.13.0 (Build 31107))
Service Studio (Version 11.12.5)

# 公式ドキュメント
[ユーザーロール](https://success.outsystems.com/ja-jp/Documentation/11/Developing_an_Application/Secure_the_Application/User_Roles)の、「OutSystemsメタモデルのユーザーロール」に記述があります。

> User_Roleエンティティは、ユーザーとロールの関連付けが保存されるメタモデルテーブルです。このエンティティには、Usersアプリケーションを使用して特定のユーザーに直接追加されたロールのみが保存されます。

> User_Effective_Roleエンティティは、ユーザー固有のロールが保存されるメタモデルビューです。このエンティティには、ユーザーに直接割り当てられたロールと、ユーザーが属しているグループに割り当てられたロールが含まれます。

# Entityの定義
(System)モジュールの下にあるEntityの属性を展開すると以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a4bc2760-27c6-30d4-17db-dc1d31ce4d5a.png)

どちらのEntityもUser_IdとRole_Idの組み合わせ。
User_Effective_RoleにEntity Action (Createなど) がないのはビューだからですね。

## EntityのDescription
### User_RoleのDescription
Roles for each end user.
（エンドユーザーに対するRole）
### User_Effective_RoleのDescription
Read-only view containing user specific roles (either direct or via user groups).
ユーザーのRole（直接付与したものとグループ経由したもの）の読み取り専用のビュー

# 動作確認
上記のことから、User_Roleはユーザーに直接付与したロール、User_Effective_Roleはユーザーに直接付与したロールとグループを経由して付与したロールを持っているように見えます。

そこで、テストユーザーに色々な方法でロールを付与して確認してみます。

## 結果まとめ
先に確認結果をまとめておきます。
確認してみたところ、曖昧だったところが明らかになっただけで、ドキュメント通りですね。

User_Roleは、ユーザーに直接付与したロールのみが登録される。UserIdで検索すると、そのユーザーに直接付与したロールの一覧が得られる。
直接付与とは、Usersアプリケーションによる付与とGrant Actionによる付与を双方を含む。

User_Effective_Roleはユーザに直接付与したロールに加えて、ユーザーが所属しているグループに付与されたロールも検索できる。

上記条件で使いたい方を選び、Role Entityとジョインさせて検索すると良さそうですね。

## Usersアプリケーションで直接ロール付与
UserId=395のユーザーRoleTestUser1を新たに作成してテスト。
付与するロールはTestRole1という名前で用意しておきます。

以下の様にUsersアプリケーションで、テスト対象ロールをユーザーに直接付与。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/9c563d64-a0b3-91c4-e615-53988409020f.png)

この状態でService StudioでEntityのデータを覗いてみましょう。
（Aggregateを使ってRole Entityをジョインしてあります）
まずは、User_Role Entity。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/b7e16b48-4369-50d9-c813-3c0eb9aa059e.png)

次はUser_Effective_Role Entity。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/5cfd92af-93d7-80ea-f9f8-0934b20ca299.png)

共に、想定通りにRoleがテストユーザーに紐付いています。

## RoleのGrant Actionでロール付与
テストユーザー (RoleTestUser2) のUserId=396
ロール=TestRole2
を用意。

Grant Actionで付与したロールがEntityに登録されるかどうかを確認する。
テストユーザーでログインし、以下のActionを実行。これでログインユーザーにTestRole2を付与している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/c495d683-b651-ed91-825d-10bc7b488f83.png)

User_Role
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/b0cad216-d358-bca1-b80d-f195c8142296.png)

User_Effective_Role
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/d9ca5379-2518-acb9-5b33-c7b4f2c207dc.png)

共に、想定通りにRoleがテストユーザーに紐付いています。
公式ドキュメントのUser_Roleの説明で「このエンティティには、Usersアプリケーションを使用して特定のユーザーに直接追加されたロールのみが保存されます。」とあるために念のために確認してみましたが、UsersアプリケーションでなくGrant Actionを使ってもUser_Roleに記録されるようです。

## Usersアプリケーションでグループを経由してロール付与 (2パターン)
### ロール付与済みグループにユーザー追加
テストユーザー (RoleTestUser3) のUserId=397
ロール=TestRole3

先にTestGroup1にTestRole3を付与しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/b43810b0-967d-67ef-b6d0-3f21a6c33425.png)

次にTestGroup1をテストユーザーに割り当てる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/129a70b9-eafd-5429-6f23-3a27659093ed.png)

User_Roleは、グループを経由して割り付けられたロールのレコードを持たない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/fb1cd7e2-d8e3-7647-5514-1335b33c55e8.png)

User_Effective_Role
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/f5fc4413-65f7-850f-2b61-294830068ba2.png)

### ユーザー追加済みグループにロール付与
テストユーザー (RoleTestUser4) のUserId=398
ロール=TestRole4

次に順番を逆にして、グループ（TestGroup2）にテストユーザーを割り当てておき、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/e72931c2-1c94-b7cd-c711-81a1f4c2a444.png)

後からグループにロールを付与する場合。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/d666e986-cff5-9728-cba5-c04e01b75c0f.png)

User_Roleにレコードが追加されないのは同じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/5d7cb7a8-d6b6-8db0-f471-2be943501feb.png)

User_Effective_Role
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/990cd0f7-5320-2833-14a1-ef3ad04a0a65.png)