AEM Forms でのサービスユーザーを使用した開発
この記事では、AEM Formsでサービスユーザーを作成するプロセスについて説明します
以前のバージョンの Adobe Experience Manager(AEM)では、管理リソースリゾルバーが、リポジトリへのアクセスを必要とするバックエンド処理に使用されていました。AEM 6.3 では、管理リソースリゾルバーの使用は非推奨(廃止予定)となっています。代わりに、リポジトリ内の特定の権限を持つシステムユーザーが使用されます。
AEM でのサービスユーザーの作成と使用について詳しく説明します。
この記事では、システムユーザーの作成とユーザーマッパープロパティの設定について説明します。
-
「admin」としてログインします。
-
「ユーザー管理」をクリックします。
-
「システムユーザーを作成」をクリックします。
-
ユーザー ID タイプを「data」に設定し、緑のアイコンをクリックして、システムユーザーの作成プロセスを完了します。
-
Apache Sling Service User Mapper Service を探し、クリックしてプロパティを開きます。
-
+ アイコン(プラス)をクリックして、次のサービスマッピングを追加します。
- DevelopingWithServiceUser.core:getresourceresolver=data
- DevelopingWithServiceUser.core:getformsresourceresolver=fd-service
-
「保存」をクリック
上記の設定では、DevelopingWithServiceUser.core がバンドルのシンボル名になります。getresourceresolver はサブサービス名です。data は、前の手順で作成したシステムユーザーです。
また、fd-service ユーザーの代わりにリソースリゾルバーを取得することもできます。このサービスユーザーは、ドキュメントサービスに使用されます。例えば、使用権限などを認証/適用する場合、fd-service ユーザーのリソースリゾルバーを使用して操作を実行します
-
OSGi バンドルをアップロードして開始します。
-
バンドルがアクティブ状態であることを確認します。
-
これで、システムユーザー を正常に作成し、サービスユーザーバンドル もデプロイしました。
/content へのアクセスを提供するには、content ノードに対する読み取り権限をシステムユーザー(「data」)に付与します。
- http://localhost:4502/useradmin に移動します。
- ユーザー「data」を検索します。これは、前の手順で作成しシステムユーザーと同じです
- ユーザーをダブルクリックし、「権限」タブをクリックします。
- 「読み取り」アクセス権を「コンテンツ」フォルダーに付与します。
- サービスユーザーを使用して /content フォルダーにアクセスするには、次のコードを使用します。
com.mergeandfuse.getserviceuserresolver.GetResolver aemDemoListings = sling.getService(com.mergeandfuse.getserviceuserresolver.GetResolver.class);
resourceResolver = aemDemoListings.getServiceResolver();
// get the resource. This will succeed because we have given ' read ' access to the content node
Resource contentResource = resourceResolver.getResource("/content/forms/af/sandbox/abc.pdf");
バンドル内の /content/dam/data.json ファイルにアクセスする場合は、次のコードを使用します。このコードは、/content/dam/ノードの「data」ユーザーに対して読み取り権限が付与されていることを前提としています。
@Reference
GetResolver getResolver;
.
.
.
try {
ResourceResolver serviceResolver = getResolver.getServiceResolver();
// To get resource resolver specific to fd-service user. This is for Document Services
ResourceResolver fdserviceResolver = getResolver.getFormsServiceResolver();
Node resNode = getResolver.getServiceResolver().getResource("/content/dam/data.json").adaptTo(Node.class);
} catch(LoginException ex) {
// Unable to get the service user, handle this exception as needed
} finally {
// Always close all ResourceResolvers you open!
if (serviceResolver != null( { serviceResolver.close(); }
if (fdserviceResolver != null) { fdserviceResolver.close(); }
}
実装の完全なコードを以下に示します
package com.mergeandfuse.getserviceuserresolver.impl;
import java.util.HashMap;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import com.mergeandfuse.getserviceuserresolver.GetResolver;
@Component(service = GetResolver.class)
public class GetResolverImpl implements GetResolver {
@Reference
ResourceResolverFactory resolverFactory;
@Override
public ResourceResolver getServiceResolver() {
System.out.println("#### Trying to get service resource resolver .... in my bundle");
HashMap < String, Object > param = new HashMap < String, Object > ();
param.put(ResourceResolverFactory.SUBSERVICE, "getresourceresolver");
ResourceResolver resolver = null;
try {
resolver = resolverFactory.getServiceResourceResolver(param);
} catch (LoginException e) {
System.out.println("Login Exception " + e.getMessage());
}
return resolver;
}
@Override
public ResourceResolver getFormsServiceResolver() {
System.out.println("#### Trying to get Resource Resolver for forms .... in my bundle");
HashMap < String, Object > param = new HashMap < String, Object > ();
param.put(ResourceResolverFactory.SUBSERVICE, "getformsresourceresolver");
ResourceResolver resolver = null;
try {
resolver = resolverFactory.getServiceResourceResolver(param);
} catch (LoginException e) {
System.out.println("Login Exception ");
System.out.println("The error message is " + e.getMessage());
}
return resolver;
}
}