我正在研究一个用例,该用例涉及访问不属于当前包的其他包的属性。为了实现这一点,我必须修改当前AEM包(AEM 6.2)的权限。我看到OSGi服务的ConditionalPermissionAdmin是前进的方向。
方法参考:http://moi.vonos.net/java/osgi-security/
我有以下代码,打算检索ConditionalPermissionAdmin但是 一些未知的原因,这总是空的。
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概念和实现的新手。
参考文献:
答案 0 :(得分:3)
通常在OSGi中,服务引用可能(尚未)可用。 因此,由于时间问题,简单地获取当前服务引用很可能会失败。
一种有效的低级方法是启动ServiceTracker并在服务可用时做出反应。尽管如此,这很难做到。
因为您已经听说过使用DS是最佳和推荐的方法。
答案 1 :(得分:2)
即使我不完全理解用例以及为什么服务用户或基于用户的访问通常不起作用,我发现这是:
felix framework security documentation建议您需要安装org.apache.felix.framework.security
软件包,默认情况下不会安装AEM(至少查看我的vanilla 6.3实例)
它列在"框架安全"在Felix子项目安装页面中:http://felix.apache.org/downloads.cgi#subprojects
问题是您的实例中没有OSGI org.osgi.service.condpermadmin.ConditionalPermissionAdmin
的实现。这就是为什么你需要felix安全包的原因。