問題
-
スクリプト・コンソールを使用してロールを作成しようとしています。 私たちがこれを正しく行っていないか、何かが正しく機能していないかのどちらかだ。
ロールを作成する際には、RoleLocalServiceUtil.addRoleを使用し、インスタンスのcompanyIdが設定されたServiceContextオブジェクトを渡します。 しかし、ロールはserviceContextに設定されたcompanyIdに対応するインスタンスではなく、メインのインスタンスに作成される。
-
再現の手順
1. Liferay-2023.Q3.2
2.を解凍します。
3. バーチャルホスト foo.localhost.com
4. 新しいインスタンスが取得したcompanyIdを確認する - 例えば12345
5. foo.localhost.comをhostsファイルに追加する
6. メインインスタンスで、コントロールパネル -> サーバー管理 -> スクリプト
7. 添付のGroovyスクリプトを実行する(Config.companyIdをインスタンスの会社IDに交換する)。実際の結果
ロール "Foo1 "と "Foo2 "はメイン・インスタンスに作成されますが、companyId 12345を持つインスタンスには作成されません。期待される結果
ロール "Foo1 "と "Foo2 "がcompanyId 12345のインスタンスに作成されます。
環境
- 7.4
- 2023.q3.2
解像度
-
その原因は、addRoles() メソッドに渡す userId で、最終的に RoleLocalServiceUtil.addRole() API 呼び出しに渡されます。
userId は次のようにして取得します:
long currentUserId = Long.parseLong(userInfo.get("liferay.user.id"))
そして、メインインスタンスに接続した状態で(そのインスタンスのユーザで)スクリプトを実行しているので、これはメインインスタンスに属する userId を返すことになり、そのような userId でロール作成メソッドを呼び出します。 - つまり、あるインスタンスで、別のインスタンスのユーザーIDを使ってロールを作成したいのですが、おそらくこれがこの動作につながるのでしょう。
- ロールを作成したいインスタンスのユーザに属する適切なuserIDを渡すようにすることをお勧めします。 これは期待通りの結果をもたらすことが確認されている。