前回、Liferayが一般ロールに与える権限を考察しました。今回は、サイトロール、組織ロールなどグループロールに対する権限の考察から始めようと思います。Liferay権限システムでは、サイトロールと組織ロールに付与される一般権限の適用範囲は
グループテンプレートと認識し、
ResourcePermissionテーブルでは
scope=3になります。
それでは、前回と同じく、モデルリソースとポートレットリソース別でサイトロール、組織ロールに付与する権限を考察しましょう。
サイトロール x モデルリソース
以下の準備を行いましょう。設定方法は前回同様です。
- blog_site_roleサイトロールを作成する
- blog_site_roleを開き
- ブログ/エントリー追加する権限を追加する
- ブログのエントリ/表示権限を追加する
- 前回、デフォルトサイトに作成したブログエンティティpermission-blogの権限定義において
では、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=50893のcom.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になります。
- リソースの特定インスタンス
- 権限の適用範囲はnameとprimKeyが特定できるリソースのみです。
リソース種類 | 特定インスタンス | リソース名 | 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;
結果は以下の通りです。
roleId | ロール名 | ロールtype |
---|
50925 | 50924 | 4 |
ID | リソース名 | scope | primKey | primKeyId | roleId | 操作 |
---|
5239 | com.liferay.blogs.model.BlogsEntry | 4 | 50893 | 50893 | 50925 | 32 |
チームを作成後、Liferayは自動的に
classPk=teamId、
className=チームのロールを作成します。そのロールに与える権限はチームの所属サイト上のブログインスタンスとブログポートレットインスタンスだけのため、チームロールの権限レコードは
scope=4になります。
scope=2
L
iferay公式ブログ記事の説明の通り、
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=2と
primKeyは
Liferay 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カスタマイズでの運用を考察したい思います。