ResourceResolverFactory getServiceResourceResolver在AEM 6.1中抛出异常

时间:2015-07-10 21:26:58

标签: aem sling

我想向AEM写一些数据,下面的代码在AEM 6.0中适用于我,但在AEM 6.1中没有,总是会抛出一个Login Exception,如下所示:

获取服务的CRX用户时出现

" 登录异常:' writeService' .org.apache.sling.api.resource.LoginException:无法派生捆绑组的用户名。 tti.commons-service [395]和子服务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上遗漏了什么吗?

4 个答案:

答案 0 :(得分:21)

在AEM 6.1中,服务用户必须是系统用户,这实际上意味着他们在JCR中的节点类型为rep:SystemUser。这些用户无法用于正常登录,仅限后台进程。管理员用户系统用户,因此您无法在此类服务用户映射中使用admin用户。您必须创建一个新的系统用户并为其分配适当的权限。

如果您想了解有关此更改的更多背景信息,请查看https://issues.apache.org/jira/browse/SLING-3854

答案 1 :(得分:20)

根据贾斯汀的建议,我尝试并找到了解决方案。发布这样可以对其他人有益。

目标:在用户登录时将数据/节点写入内容(特别是/ etc / userdata)。

我们可以通过两种方式实现这一目标(无论哪种方式,用户都需要成为&#39;系统用户&#39;)

流程1:

步骤1:在OSGI配置中使用内置系统用户。在OSGI中,选择 Apache Sling Service用户映射器服务

group.abc.commons-service:writeService=oauthservice(其中oauthservice是系统用户)

步骤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/userdataenter image description here

步骤3:打开OSGI控制台并转到 Apache Sling 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");
}

答案 2 :(得分:0)

此外,如果您计划将来迁移到AEM 6.2,请考虑使用ACS Commons来促进系统用户的创建和可用性。它消除了所有可能容易出错的手动过程。

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

答案 3 :(得分:-4)

做了类似的会议:

adminSession = resourceResolverWriter.adaptTo(Session.class);`

如下所示制作会话,希望不会发生登录异常

final Session session;
session= resourceResolver.adaptTo(Session.class);

这是因为resourceResolverWriter不是隐式对象。