在 AEM 中使用 getServiceReference 进行检索时,OSGI ConfigurationAdmin 为空

OSGI ConfigurationAdmin is null while retrieving using getServiceReference in AEM

我正在处理一个用例,该用例涉及访问不属于当前捆绑包的其他捆绑包的属性。为了实现这一点,我必须修改当前 AEM 捆绑包 (AEM 6.2) 的权限。我看到 OSGi 服务的 ConditionalPermissionAdmin 是前进的方向。

方法参考:http://moi.vonos.net/java/osgi-security/

我有以下代码,旨在检索 ConditionalPermissionAdmin 但是 一些未知的原因 this 总是空的。

public class Activator implements BundleActivator {

   private static final Logger LOG = LoggerFactory.getLogger(Activator.class);

   private ConditionalPermissionAdmin conditionalPermissionAdmin;

  @Override
  public final void start(final BundleContext bundleContext) {
    try {
        conditionalPermissionAdmin = getConditionalPermissionAdmin(bundleContext);
        if (conditionalPermissionAdmin != null) {
            LOG.info("{0} conditionalPermissionAdmin ", conditionalPermissionAdmin.getClass());
           /* pseudocode */
        }
        LOG.info("{0} started", bundleContext.getBundle().getSymbolicName());
    }  catch (Exception ex) {
        LOG.error(ex.getMessage());
    }
  }

  private ConditionalPermissionAdmin getConditionalPermissionAdmin(BundleContext context) throws BundleException {
    ServiceReference ref = context.getServiceReference(ConditionalPermissionAdmin.class.getName());
    ConditionalPermissionAdmin permissionAdmin = null;
    if (ref != null) {
        permissionAdmin = (ConditionalPermissionAdmin) context.getService(ref);
    }
    return permissionAdmin;
  }

  @Override
  public final void stop(final BundleContext bundleContext) {
    LOG.info("{0} stopped", bundleContext.getBundle().getSymbolicName());
  }
}

我没有看到任何构建或运行时问题。连包裹都完好无损。

这种低级 API 并不是所建议的最佳方法 here。但我不确定声明式服务的许可方法。

注意 --> 我是 OSGi 概念和实现的新手。

参考文献:

通常在 OSGi 中,服务引用可能(还)不可用。 所以简单地获取当前服务引用很可能因为时间问题而失败。

一种有效的低级别方法是启动 ServiceTracker 并在服务可用时做出反应。但这很难做到正确。

正如您已经听说的那样,使用 DS 是最佳和推荐的方法。

尽管我不完全理解用例以及为什么服务用户或基于用户的访问通常不起作用,但我发现了以下内容:

felix framework security documentation 建议您需要安装 org.apache.felix.framework.security 包,默认情况下 AEM 不会安装它(至少看看我的 vanilla 6.3 实例)

它在 Felix 子项目安装页面的 "Framework Security" 下列出:http://felix.apache.org/downloads.cgi#subprojects

问题是您的实例中没有 OSGI org.osgi.service.condpermadmin.ConditionalPermissionAdmin 的实现。这就是您需要 felix 安全包的原因。