一部のデータをAEMに書き込みたいのですが、以下のコードはAEM 6.0では正常に機能しますが、AEM 6.1では機能しません。常に次のようにログイン例外をスローします。
"サービスのCRXユーザーを取得する際のログイン例外: 'writeService'.org.Apache.sling.api.resource.LoginException:バンドルgroup.tti.commons-service [395]およびsubのユーザー名を取得できませんサービスwriteService "
OSGI設定:
私のクラスのコード:
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で何か不足していますか?
ジャスティンのアドバイスで、私は試してみて解決策を見つけました。そのように投稿することは、他の人にとって有益です。
目標:ユーザーがログインしたときにコンテンツ(具体的には/ etc/userdata)にデータ/ノードを書き込む。
これは2つの方法で実現できます(どちらの方法でも、ユーザーは「システムユーザー」である必要があります)
ステップ1:OSGI構成で組み込みシステムユーザーを使用します。 OSGIでApache Sling Service User Mapper Serviceを選択します
group.abc.commons-service:writeService=oauthservice
(oauthservice
はシステムユーザー)
手順2:そのシステムユーザーに、コンテンツフォルダーにアクセスするためのアクセス許可を割り当てます。
CRXのシステムユーザーは次の場所に表示されます:/home/users/system
ステップ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
)
ステップ3:OSGIコンソールを開き、Apache Sling Service User Mapper Serviceに移動して、サービスとユーザーのマッピングを定義します。
例:group.commons-service:writeService=abcwriteservice
ステップ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");
}
AEM 6.1では、サービスユーザーはシステムユーザーである必要があります。つまり、JCR内のノードのタイプはrep:SystemUserです。これらのユーザーは、バックグラウンドプロセスによってのみ、通常のログインに使用できません。管理ユーザーはシステムユーザーではないため、このようなサービスユーザーマッピングで管理ユーザーを使用することはできません。新しいシステムユーザーを作成し、適切な権限を割り当てる必要があります。
この変更の背景をもっと読みたい場合は、 https://issues.Apache.org/jira/browse/SLING-3854 をご覧ください。
また、AEM 6.2への将来の移行を計画している場合は、ACS Commonsを使用してシステムユーザーの作成と可用性を促進することを検討してください。エラーが発生しやすいこの手動プロセスをすべて排除します。
https://Adobe-consulting-services.github.io/acs-aem-commons/features/ensure-service-users/index.html