ResourceResolverFactory getServiceResourceResolver在AEM 6.1中引发异常

ResourceResolverFactory getServiceResourceResolver在AEM 6.1中引发异常,aem,sling,Aem,Sling,我想向AEM写入一些数据,下面的代码在AEM 6.0中对我来说很好,但在AEM 6.1中不行,总是抛出一个登录异常,如下所示: “获取服务的CRX用户时出现登录异常:'writeService'.org.apache.sling.api.resource.LoginException:无法派生bundle group.tti.commons-Service[395]和子服务writeService的用户名” OSGI配置: 我的班级代码: import javax.jcr.Session; i

我想向AEM写入一些数据,下面的代码在AEM 6.0中对我来说很好,但在AEM 6.1中不行,总是抛出一个登录异常,如下所示:

“获取服务的CRX用户时出现登录异常:'writeService'.org.apache.sling.api.resource.LoginException:无法派生bundle group.tti.commons-Service[395]和子服务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) {
...
}
import javax.jcr.Session;
导入org.apache.sling.api.resource.ResourceResolver;
导入org.apache.sling.api.resource.ResourceResolverFactory;
....
@参考文献
私营工厂;
私有ResourceResolver ResourceResolver编写器;
私有静态会话管理会话;
...
...
Map param=new HashMap();
参数put(resourcesolverfactory.SUBSERVICE,“writeService”);
试一试{
resourceResolverWriter=factory.getServiceResourceResolver(参数);
adminSession=resourceResolverWriter.adapto(Session.class);
...
}捕获(LoginException e){
...
}

我在AEM 6.1上遗漏了什么吗?

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


如果您想阅读更多有关此更改的背景信息,请查看。

而不是将会话设置为:

adminSession = resourceResolverWriter.adaptTo(Session.class);`
使会话如下所示,希望登录异常不会发生

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

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

在Justin的建议下,我尝试并找到了解决方案。发布这样的信息可能对其他人有益

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

我们可以通过两种方式实现这一点(无论哪种方式,用户都需要是“系统用户”)

过程1: 步骤1:在OSGI配置中使用内置系统用户。在OSGI中选择ApacheSling服务用户映射器服务

group.abc.commons服务:writeService=oauthservice
(其中,
oauthservice
是系统用户)

步骤2:为该系统用户分配访问内容文件夹的权限

您可以在以下位置看到CRX中的系统用户:
/home/users/system

过程2: 步骤1:创建一个新的系统用户。这样做 打开

我已经创建了abcwriteservice用户

步骤2:转到权限,并为用户abcwriteservice授予访问您要写入的文件夹的权限。(在本例中:
/etc/userdata

第3步:打开OSGI控制台,转到ApacheSling服务用户映射器服务,定义服务用户映射

示例:
group.commons服务:writeService=abcwriteservice

步骤4:在代码中,我添加了额外的参数,如下所示:

Map param=newhashmap();
参数put(resourcesolverfactory.SUBSERVICE,“writeService”);
试一试{
resourceResolverWriter=factory.getServiceResourceResolver(参数);
if(resourceResolverWriter==null)
抛出新异常(“无法获取服务的CRX用户:'writeService'”);
Node usersRootNode=adminSession.getNode(“/etc/userdata/users”);
}

< /代码>

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


我假设这里对resourceResolverWriter的引用是一个输入错误。否则,此代码甚至无法编译。更新了原始帖子中的代码。我们如何才能创建新的系统用户?@suren我建议使用此AEM访问控制工具。我认为一旦会话定义为最终会话,我们无法再次为其赋值。无论如何,我已经在我的原始帖子中更新了代码。这是不正确的。请参阅Surendra和Justice的答案。我如何在Sling模型中做到这一点?就像我想强迫Sling模型使用我的服务用户登录JCRI一样,我没有尝试过,但这可能会有所帮助,感谢@Suren这确实有帮助,我的方法是错误的,这样的操作不应该发生在Sling模型中。我改变了我的方法,事情成功了。谢谢。
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 :)`