文档根本没有帮助,OSGi in Action没有关于如何做事的例子。例如,我想要捆绑A来拒绝从Bundle B等中导入包。简单的例子,从头到尾 - 我找不到它们。
但回到我的问题,我想阻止对System.exit
的调用,原因显而易见,除了“不要实现自己的安全管理器”,我没有从处女座论坛得到太多,因此我的问题在这里。
修改
因为我希望在处女座发生这种情况,所以我试过这个:
public void start(BundleContext context) throws Exception {
System.out.println("===== Starting Bundle PermissionsTest =====");
SecurityManager securityManager = System.getSecurityManager();
if(securityManager == null) throw new IllegalArgumentException("Security Manager is not defined!");
ServiceReference serviceReference =
(ServiceReference) context.getServiceReference(ConditionalPermissionAdmin.class.getName());
if(serviceReference == null) throw new IllegalArgumentException(ConditionalPermissionAdmin.class.getName() + " IS NULL");
else System.out.println("===== Good so far 1 =====");
ConditionalPermissionAdmin conditionalPermissionAdmin =
(ConditionalPermissionAdmin)context.getService(serviceReference);
if(conditionalPermissionAdmin == null) throw new IllegalArgumentException("ConditionalPermissionAdmin can not be found");
else System.out.println("===== Good so far 2 =====");
我在处女座中首先做的是启用Equinox安全管理器(因为这是处女座使用的那个)。 OSGi的规范说每个容器必须实现它自己的Security Manager,扩展了一堆OSGi特定的操作。
在处女座的情况下,这是Equinox安全管理器。启用它非常简单 - 只需在bin / dmk.sh中添加两行,就可以了。
好的,所以我确实有ConditionalPermissionAdmin - 好!现在,我可以添加一个安全检查,比如BundlePermission对Bundle说。当然,但这发生在捆绑特定行动,如启动/停止/导出等等。我似乎无法弄清楚如何为LifeCycle动作做到这一点 - 在我的案例中是System.exit
顺便说一句,我使用osgi-core的4.2.0版本,而nope我无法升级到4.3.0,至少现在不行。答案 0 :(得分:4)
System.exit由RuntimePermission(“exitVm”,“<>”)管理,因此规范中的示例语法提供
DENY {
( java.lang.RuntimePermission "exitVm" "*" )
}
在Java代码中(尚未测试,所以要小心):
ConditionalPermissionInfo info = admin.newConditionalPermissionInfo(
"name",
null,
new PermissionInfo[] { new PermissionInfo(
"java.lang.RuntimePermission", "exitVm", "*") },
ConditionalPermissionInfo.DENY
);
ConditionalPermissionUpdate update = admin
.newConditionalPermissionUpdate();
update.getConditionalPermissionInfos().add(0, info);
update.commit();
在"OSGi in Action"一书中,主题得到了很好的对待。请记住,规范的主要受众是规范的实现者,而不是最终用户。成员应该提供教育材料来弥补这一差距。后来的规范试图让最终用户更有教育意义。