apache-felix - 在 Felix OSGI 中使用 Java 创建 JAAS 配置
问题描述
我想在 Apache Sling 中为 SAML2 登录包设置默认 JAAS 配置(不使用/system/console/configMgr
UI)
jaas.classname="org.apache.sling.auth.saml2.sp.Saml2LoginModule"
jaas.controlFlag="Sufficient"
jaas.ranking=110
jaas.realmName="jackrabbit.oak"
我正在考虑两个选项:
A)在 /apps 下的 JCR Filevault 包中创建“配置”节点
B)在包的激活方法中使用 Java 创建配置
方法 A在安装包后可以正常工作。它确实设置了我想要的配置,但是在重新启动时 Sling 不高兴,并且永远不会完成启动。如下所示的日志中有错误。我将此解释为某种时间冲突,因为在提供 LoginModule 的 JAAS 配置中提到的捆绑包尚未激活。(请随时发表您对此的想法)
重新启动时出现错误...
27.06.2020 14:28:45.985错误[Apache Sling Resource Provider Change Notifier] org.apache.sling.extensions.threaddump.internal.Activator 线程中未捕获的异常 [Apache Sling Resource Provider Change Notifier,5,main] java.lang.AssertionError: No bundle exists to create LoginModule来自 org.apache.felix.jaas.internal.BundleLoginModuleCreator.newInstance(BundleLoginModuleCreator.java:59) [org.apache.felix.jaas:1.0.2] 上的 org.apache.sling.auth.saml2.sp.Saml2LoginModule .apache.felix.jaas.internal.ConfigLoginModuleProvider.createLoginModule(ConfigLoginModuleProvider.java:80) [org.apache.felix.jaas:1.0.2] 在 org.apache.felix.jaas.boot.ProxyLoginModule.initialize(ProxyLoginModule.java :46) [org.apache.felix.jaas:1.0.2] 在 java.base/javax.security.auth.login.LoginContext.invoke(LoginContext.java:716) 在 java.base/javax.security.auth。 login.LoginContext$4。在 java.base/javax.security.auth.login.LoginContext$4.run(LoginContext.java:663) 在 java.base/java.security.AccessController.doPrivileged(Native Method) 在 java 运行(LoginContext.java:665) .base/javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:663) 在 java.base/javax.security.auth.login.LoginContext.login(LoginContext.java:574) 在 org.apache.jackrabbit .oak.core.ContentRepositoryImpl.login(ContentRepositoryImpl.java:163) [org.apache.jackrabbit.oak-core:1.26.0] 在 org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl.login(RepositoryImpl.java :282) [org.apache.jackrabbit.oak-jcr:1.26.0] 在 org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl.login(RepositoryImpl.java:225) [org.apache.jackrabbit.oak- jcr:1.26.0] 在 org.apache.jackrabbit.oak.jcr.session.SessionImpl.impersonate(SessionImpl.java:275) [org.apache.jackrabbit.oak-jcr:1。26.0] 在 org.apache.sling.jcr.oak.server.internal.TcclWrappingJackrabbitSession.impersonate(TcclWrappingJackrabbitSession.java:84) [org.apache.sling.jcr.oak.server:1.2.4] 在 org.apache.sling .jcr.base.AbstractSlingRepository2.createServiceSession(AbstractSlingRepository2.java:205) [org.apache.sling.jcr.base:3.1.0] 在 org.apache.sling.jcr.base.AbstractSlingRepository2.createServiceSession(AbstractSlingRepository2.java:170 ) [org.apache.sling.jcr.base:3.1.0] 在 org.apache.sling.jcr.base.AbstractSlingRepository2.loginService(AbstractSlingRepository2.java:383) [org.apache.sling.jcr.base:3.1。 0] 在 org.apache.sling.jcr.resource.internal.helper.jcr.JcrProviderStateFactory.createProviderState(JcrProviderStateFactory.java:115) [org.apache.sling.jcr.resource:3.0.20] 在 org.apache.sling .jcr.resource.internal.helper.jcr.JcrResourceProvider。在 org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.authenticate(JcrResourceProvider.java:75) 进行身份验证(JcrResourceProvider.java:303)[org.apache.sling.jcr.resource:3.0.20] [org.apache.sling.jcr.resource:3.0.20] 在 org.apache.sling.resourceresolver.impl.providers.stateful.ProviderManager.authenticate(ProviderManager.java:161) [org.apache.sling.resourceresolver:1.6 .16] 在 org.apache.sling.resourceresolver.impl.providers.stateful.ProviderManager.getOrCreateProvider(ProviderManager.java:87) [org.apache.sling.resourceresolver:1.6.16] 在 org.apache.sling.resourceresolver。 impl.providers.stateful.ProviderManager.authenticateAll(ProviderManager.java:129) [org.apache.sling.resourceresolver:1.6.16] 在 org.apache.sling.resourceresolver.impl.ResourceResolverImpl.createControl(ResourceResolverImpl.java:143) [org.apache.sling。resourceresolver:1.6.16] 在 org.apache.sling.resourceresolver.impl.ResourceResolverImpl.(ResourceResolverImpl.java:104) [org.apache.sling.resourceresolver:1.6.16] 在 org.apache.sling.resourceresolver.impl。 ResourceResolverImpl.(ResourceResolverImpl.java:98) [org.apache.sling.resourceresolver:1.6.16] 在 org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl.getResourceResolverInternal(CommonResourceResolverFactoryImpl.java:280) [org.apache.sling. resourceresolver:1.6.16] 在 org.apache.sling.resourceresolver.impl.ResourceResolverFactoryImpl.getServiceResourceResolver(ResourceResolverFactoryImpl.java:89) [org.apache.sling.resourceresolver:1.6.16] 在 org.apache.sling.i18n.impl .JcrResourceBundleProvider.createResourceResolver(JcrResourceBundleProvider.java:163) [org.apache.sling.i18n:2.5.14] 在 org.apache.sling.i18n.impl。JcrResourceBundleProvider.onChange(JcrResourceBundleProvider.java:266) [org.apache.sling.i18n:2.5.14] 在 org.apache.sling.i18n.impl.JcrResourceBundleProvider.onChange(JcrResourceBundleProvider.java:216) [org.apache.sling .i18n:2.5.14] 在 org.apache.sling.resourceresolver.impl.observation.BasicObservationReporter.reportChanges(BasicObservationReporter.java:211) [org.apache.sling.resourceresolver:1.6.16] 在 org.apache.sling。 resourceresolver.impl.observation.BasicObservationReporter.reportChanges(BasicObservationReporter.java:189) [org.apache.sling.resourceresolver:1.6.16] 在 org.apache.sling.resourceresolver.impl.providers.ResourceProviderTracker.postResourceProviderChange(ResourceProviderTracker.java: 406) [org.apache.sling.resourceresolver:1.6.16] 在 org.apache.sling.resourceresolver.impl.providers.ResourceProviderTracker。访问 $400(ResourceProviderTracker.java:59) [org.apache.sling.resourceresolver:1.6.16] 在 org.apache.sling.resourceresolver.impl.providers.ResourceProviderTracker$2.run(ResourceProviderTracker.java:517) [org.apache .sling.resourceresolver:1.6.16] 在 java.base/java.lang.Thread.run(Thread.java:834)
使用方法 B,我认为不会出现这种竞争条件或时间问题,并且应该可以使用下面的 Java 代码编写配置。
void createSaml2Jaas(){
logger.info("create saml2 jaas");
try {
Configuration jaasConfig = configAdmin.createFactoryConfiguration(JAAS_SAML2PID);
Dictionary<String, Object> properties = new Hashtable<>();
properties.put("jaas.classname", "org.apache.sling.auth.saml2.sp.Saml2LoginModule");
properties.put("jaas.controlFlag", "Sufficient");
properties.put("jaas.ranking","110");
properties.put("jaas.realmName","jackrabbit.oak");
jaasConfig.update(properties);
} catch (IOException e) {
logger.error("Problem creating JAAS Configs", e);
}
}
这将创建一个 OSGI 配置,但未正确绑定。Web 控制台中显示的配置说明如下
此表单是从现有属性自动生成的,因为此配置没有可用的属性描述符。这可能是由于缺少 OSGi Metatype Service 或缺少此配置的 MetaType 描述符造成的。
问题:我需要做什么才能以org.apache.felix.jaas.Configuration.factory
编程方式(或通过包)创建一个正确绑定的 OSGI 配置,而不会导致应用程序启动出现问题?
解决方案
诚然,我的“问题”与发布的确切“问题”略有不同。关于这个问题,我仍然想知道如何使用 Java 代码为捆绑包编写 Felix OSGI 配置。
这篇文章中有一个解决方案 如何定义 OSGi 捆绑启动级别?关于设置捆绑启动值。Apache Sling JCR 安装程序 (org.apache.sling.installer.provider.jcr) 是负责从“runmode/config”下“/apps”下的 JCR 节点中的定义创建 OSGI 配置的包。此包的启动级别为 20。
将我的包的启动级别从 20 更改为 19。解决了 error.log 中打印的 Java 异常
public class Activator implements BundleActivator {
private static final int START_LEVEL = 19;
public void start(BundleContext context) throws Exception {
context.getBundle().adapt(BundleStartLevel.class).setStartLevel(START_LEVEL);
推荐阅读
- c# - 如何防止用户访问其他用户的个人资料?
- django - 我可以在 django-models 中添加颜色选择器吗
- reactjs - 使用 Winterfell 响应表单
- firebase - 如何在不使用(已弃用)数据库机密的情况下将 Firebase 集成到 Google Apps 脚本中
- asp.net-core - 在具有 EF Core 迁移的 Net Core 类库上使用 settings.json
- matlab - 如何在 MATLAB 中调整条形绝对宽度
- c++ - Qt 对于我的带宽上限来说太大了。我的替代方案是什么?
- uitableview - 设置 UITableViewCellAccessory 的左 X 位置
- dask - 无法通过 SSH 启动 dask 集群
- appium - 如何使用 Appium 运行需要两台设备的测试