我想向AEM写一些数据,下面的代码在AEM 6.0中适用于我,但在AEM 6.1中没有,总是会抛出一个Login Exception,如下所示:
获取服务的CRX用户时出现" 登录异常:' writeService' .org.apache.sling.api.resource.LoginException:无法派生捆绑组的用户名。 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) {
...
}
我在AEM 6.1上遗漏了什么吗?
答案 0 :(得分:21)
在AEM 6.1中,服务用户必须是系统用户,这实际上意味着他们在JCR中的节点类型为rep:SystemUser。这些用户无法用于正常登录,仅限后台进程。管理员用户不系统用户,因此您无法在此类服务用户映射中使用admin用户。您必须创建一个新的系统用户并为其分配适当的权限。
如果您想了解有关此更改的更多背景信息,请查看https://issues.apache.org/jira/browse/SLING-3854。
答案 1 :(得分:20)
根据贾斯汀的建议,我尝试并找到了解决方案。发布这样可以对其他人有益。
目标:在用户登录时将数据/节点写入内容(特别是/ etc / userdata)。
我们可以通过两种方式实现这一目标(无论哪种方式,用户都需要成为&#39;系统用户&#39;)
步骤1:在OSGI配置中使用内置系统用户。在OSGI中,选择 Apache Sling 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用户映射器服务以定义服务用户映射。
示例: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");
}
答案 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不是隐式对象。