web-dev-qa-db-ja.com

ResourceResolverFactory getServiceResourceResolverがAEM 6.1で例外をスローする

一部のデータをAEMに書き込みたいのですが、以下のコードはAEM 6.0では正常に機能しますが、AEM 6.1では機能しません。常に次のようにログイン例外をスローします。

"サービスのCRXユーザーを取得する際のログイン例外: 'writeService'.org.Apache.sling.api.resource.LoginException:バンドルgroup.tti.commons-service [395]およびsubのユーザー名を取得できませんサービスwriteService "

OSGI設定:

enter image description here

私のクラスのコード:

import javax.jcr.Session;
import org.Apache.sling.api.resource.ResourceResolver;
import org.Apache.sling.api.resource.ResourceResolverFactory;
....
@Reference
private ResourceResolverFactory factory;
private ResourceResolver resourceResolverWriter;
private static Session adminSession;
...
...
Map<String, Object> param = new HashMap<String, Object>();        
    param.put(ResourceResolverFactory.SUBSERVICE, "writeService");
try {
  resourceResolverWriter = factory.getServiceResourceResolver(param);            
  adminSession = resourceResolverWriter.adaptTo(Session.class);
...
} catch (LoginException e) {
...
}

AEM 6.1で何か不足していますか?

13
Suren Konathala

ジャスティンのアドバイスで、私は試してみて解決策を見つけました。そのように投稿することは、他の人にとって有益です。

目標:ユーザーがログインしたときにコンテンツ(具体的には/ etc/userdata)にデータ/ノードを書き込む。

これは2つの方法で実現できます(どちらの方法でも、ユーザーは「システムユーザー」である必要があります)

プロセス1:

ステップ1:OSGI構成で組み込みシステムユーザーを使用します。 OSGIでApache Sling Service User Mapper Serviceを選択します

group.abc.commons-service:writeService=oauthserviceoauthserviceはシステムユーザー)

手順2:そのシステムユーザーに、コンテンツフォルダーにアクセスするためのアクセス許可を割り当てます。

enter image description here

CRXのシステムユーザーは次の場所に表示されます:/home/users/system

プロセス2:

ステップ1:新しいシステムユーザーを作成します。これを行うには http:// localhost:4502/crx/Explorer/index.jsp

1. Login as admin 
2. Open 'User Administration
3. Select 'Create System User'
4. Enter "user id"
5. Hit the Green button (you will not se a save button :)`

abcwriteserviceユーザーを作成しました

手順2:アクセス許可に移動し、ユーザーabcwriteserviceに対して、書き込み先のフォルダーにアクセスするためのアクセス許可を付与します。 (この例では、/etc/userdata) enter image description here

ステップ3:OSGIコンソールを開き、Apache Sling Service User Mapper Serviceに移動して、サービスとユーザーのマッピングを定義します。

例:group.commons-service:writeService=abcwriteservice

enter image description here

ステップ4:コードで、次のように追加のパラメーターを追加しました。

Map<String, Object> param = new HashMap<String, Object>();
param.put(ResourceResolverFactory.SUBSERVICE, "writeService");

try {
    resourceResolverWriter = factory.getServiceResourceResolver(param);

    if (resourceResolverWriter == null)
        throw new Exception("Could not obtain a CRX User for the Service:'writeService'");

    Node usersRootNode = adminSession.getNode("/etc/userdata/users");
}
21
Suren Konathala

AEM 6.1では、サービスユーザーはシステムユーザーである必要があります。つまり、JCR内のノードのタイプはrep:SystemUserです。これらのユーザーは、バックグラウンドプロセスによってのみ、通常のログインに使用できません。管理ユーザーはシステムユーザーではないため、このようなサービスユーザーマッピングで管理ユーザーを使用することはできません。新しいシステムユーザーを作成し、適切な権限を割り当てる必要があります。

この変更の背景をもっと読みたい場合は、 https://issues.Apache.org/jira/browse/SLING-3854 をご覧ください。

21
Justin Edelson

また、AEM 6.2への将来の移行を計画している場合は、ACS Commonsを使用してシステムユーザーの作成と可用性を促進することを検討してください。エラーが発生しやすいこの手動プロセスをすべて排除します。

https://Adobe-consulting-services.github.io/acs-aem-commons/features/ensure-service-users/index.html

0
Jose Berciano