Tuesday, May 26, 2020

ResourcePermissionの考察 (2)

前回、Liferayが一般ロールに与える権限を考察しました。今回は、サイトロール、組織ロールなどグループロールに対する権限の考察から始めようと思います。Liferay権限システムでは、サイトロールと組織ロールに付与される一般権限の適用範囲はグループテンプレートと認識し、ResourcePermissionテーブルではscope=3になります

それでは、前回と同じく、モデルリソースとポートレットリソース別でサイトロール、組織ロールに付与する権限を考察しましょう。

サイトロール x モデルリソース

以下の準備を行いましょう。設定方法は前回同様です。

  • blog_site_roleサイトロールを作成する
  • blog_site_roleを開き
    • ブログ/エントリー追加する権限を追加する
    • ブログのエントリ/表示権限を追加する
  • 前回、デフォルトサイトに作成したブログエンティティpermission-blogの権限定義において
    • blog_site_role更新権限を追加する
では、Role_ResourcePermissionテーブルを確認しましょう。

select roleId, name, type_ from Role_ where name = "blog_site_role";
select resourcePermissionId, name, scope, primKey, primKeyId, roleId, actionIds
from ResourcePermission where roleId = 50910;
結果は以下の通りです。

roleId ロール名 ロールtype
50910 blog_site_role 2
ID リソース名 scope primKey primKeyId roleId 操作
5226 com.liferay.blogs 3 0 0 50910 2
5227 com.liferay.blogs.model.BlogsEntry 3 0 0 50910 1
5228 com.liferay.blogs.model.BlogsEntry 4 50893 50893 50910 32
その結果が表す意味を考察しましょう。

ID ロール どんなリソース どの操作
5226 blog_site_role scope=3: サイトロールblog_site_roleを持つサイト中の全てcom.liferay.blogs ADD_ENTRY
5227 blog_site_role scope=3: サイトロールblog_site_roleを持つサイト中の全てcom.liferay.blogs.model.BlogsEntry VIEW
5228 blog_site_role scope=4: id=50893com.liferay.blogs.model.BlogsEntryインスタンス UPDATE
※ ユーザは複数サイト中同じサイトロールに割り当てられることができるため、ユーザがサイトロールを持つサイト中のみに、そのサイトロールに与えるscope=3の権限を持ちます。

サイトロール x ポートレットリソース

以下の準備を行いましょう。
  • blog_site_roleを開いて、権限定義に
    • アプリケーション権限/ページに追加する権限を追加する
  • デフォルトサイトのブログポートレットに
    • ポートレット権限設定を開いてblog_site_role設定権限を追加する
それ後、ロールとResourcePermissionテーブルで確認しましょう。結果は以下の通りです(重複するデータについては除外します)。


ID リソース名 scope primKey primKeyId roleId 操作
5232 com_liferay_blogs_web_portlet_BlogsPortlet 3 0 0 50910 2
5233 com_liferay_blogs_web_portlet_BlogsPortlet 4 38656_LAYOUT_com_liferay_blogs_web_portlet_BlogsPortlet 0 50910 4
結果を考察しましょう。

ID ロール どんなリソース どの操作
5232 blog_site_role scope=3: サイトロールblog_site_roleを持つサイト中の全てBlogsPortlet ADD_ENTRY
5228 blog_site_role scope=4: id=38656のレイアウト上のBlogsPortlet UPDATE

組織ロール

Liferayでは組織ロールの挙動はサイトロールとほぼ一致のため省略します。

まとめ

ここまで考察した結果をまとめましょう。scope=3のサイトロールと組織ロールの適用範囲はユーザが当該ロールを割り当てられているかとうかで決まります。

  • 特定インスタンスを持っていないリソース
    • サイトロールの権限の適用範囲は、ユーザが当該ロールを割り当てられているサイトのみです。そのため、リソースprimKeyは0になります。
    • 組織ロールの権限の適用範囲は、ユーザが当該ロールを割り当てらている組織の組織サイトです。そのため、リソースprimKeyは0になります。
  • リソースの特定インスタンス
    • 権限の適用範囲はnameprimKeyが特定できるリソースのみです。

リソース種類 特定インスタンス リソース名 scope primKey 適用範囲
モデル N モデル名 1 companyId primKeyが表すLiferayインスタンス
モデル N モデル名 3 0 roleIdが表すロールを持ち場所(サイトまたは組織のサイト)中の全モデルインスタンス
モデル Y モデル名 4 リソースId primKeyが表すモデルインスタンス
ポートレット N ポートレットキー 1 companyId primKeyが表すLiferayインスタンス
ポートレット N ポートレットキー 3 0 roleIdが表すロールを持ち場所(サイトまたは組織のサイト)中の全primKeyが表すポートレット
ポートレット Y ポートレットキー 4 layout
ポートレットキー
primKeyが表すポートレット

その他

チームロール
Liferayでは、サイト内のチームが作成できます。チームに権限を与えることもできます。例として、デフォルトサイトにteam-1チームを作成した後に、前回作成したpermission-blogの権限設定を開いてteam-1ロールを確認できます。



では、team-1ロールに更新する権限を追加し、データベースを確認しましょう。

select teamId, name from Team where name = "team-1";
select roleId, name, type_ from Role_ where name = "50924";
select resourcePermissionId, name, scope, primKey, primKeyId, roleId, actionIds
from ResourcePermission where roleId = 50925;
結果は以下の通りです。

teamId チーム名
50924 team-1
roleId ロール名 ロールtype
50925 50924 4
ID リソース名 scope primKey primKeyId roleId 操作
5239 com.liferay.blogs.model.BlogsEntry 4 50893 50893 50925 32
チームを作成後、Liferayは自動的にclassPk=teamIdclassName=チームのロールを作成します。そのロールに与える権限はチームの所属サイト上のブログインスタンスとブログポートレットインスタンスだけのため、チームロールの権限レコードはscope=4になります。
scope=2
Liferay公式ブログ記事の説明の通り、scope=2(グループ範囲)のResourcePermissionレコードが存在します。ただし、今まで検証した権限のscopeはいずれでも2になりません。では、scope=2の権限は一体何でしょうか?

答えは、指定されたグループ(=サイト)内のリソースのみに有効する権限です。以下の手順で検証しましょう。

  • 一般ロールblog_roleを開き
    • 権限の定義ブログ/権限設定を追加する
    • 追加の際、権限設定項目の右の変更ボタンを押し、Liferay DXP(デフォルトサイト)とユーザー非公開サイトを選択する


その後、データベースをチェックしましょう。

select resourcePermissionId, name, scope, primKey, primKeyId, roleId, actionIds
from ResourcePermission where roleId = 50867 and scope = 2;
結果はご覧の通り、scope=2primKeyLiferay DXPサイトとユーザー非公開サイトgroupIdの権限レコードが作成されました。

ID リソース名 scope primKey primKeyId roleId 操作
5324 com_liferay_blogs_web_portlet_BlogsPortlet 2 20126 20126 50867 8
5325 com_liferay_blogs_web_portlet_BlogsPortlet 2 20132 20132 50867 8
では、scope=2の権限とscope=3のサイトロールの権限の違いを考察しましょう。

scope 適用範囲
2 primKeyが表すサイト内のリソース、1個レコードの適用サイト数は1
3 roleIdが表すサイトロールを持つサイト内のリソース 、1個レコードは複数サイト適用可能

次回はここまて考察した内容をLiferayカスタマイズでの運用を考察したい思います。

No comments: