【问题标题】:ResourceResolverFactory getServiceResourceResolver throws Exception in AEM 6.1ResourceResolverFactory getServiceResourceResolver 在 AEM 6.1 中引发异常
【发布时间】:2015-07-10 21:26:58
【问题描述】:

我想向 AEM 写入一些数据,下面的代码在 AEM 6.0 中对我来说可以正常工作,但在 AEM 6.1 中却不行,总是引发如下登录异常:

获取服务的 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 上遗漏了什么吗?

【问题讨论】:

  • 我假设这里对 resourceResolverWriter 的引用是一个错字。否则这段代码甚至不会编译。
  • 更新了原帖中的代码。

标签: aem sling


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

在贾斯汀的建议下,我尝试并找到了解决方案。发布这样的内容可能对其他人有益。

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

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

流程1:

第 1 步:在 OSGI 配置中使用内置系统用户。在 OSGI 中选择 Apache Sling Service User Mapper Service

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

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

您在 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/userdata

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

【讨论】:

  • 如何在 Sling 模型中执行此操作?就像我想强制 Sling 模型使用我的服务用户登录到 JCR
  • 我没试过,但这可能会有所帮助forums.adobe.com/thread/2495543
  • 谢谢@Suren 这确实有帮助,我的方法是错误的,这样的操作不应该发生在吊索模型中。我改变了我的方法并且事情奏效了。欣赏它。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    创建会话如下:

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

    像下面这样创建会话,希望不会出现登录异常

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

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

    【讨论】:

    • 我认为一旦将 session 定义为 final,我们就不能再次为其分配值。无论如何,我已经更新了我原来帖子中的代码。
    • 这不正确。请参阅 Surendra 和 Justice 的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2015-09-25
    • 1970-01-01
    相关资源
    最近更新 更多