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