【发布时间】:2020-10-18 07:36:04
【问题描述】:
我想在 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) 在 bundle 的 activate 方法中使用 Java 创建配置
Approach A 在安装包后可以正常工作。它确实设置了我想要的配置,但是在重新启动时 Sling 不高兴,并且永远不会完成启动。如下所示的日志中有错误。我将此解释为某种时间冲突,因为在提供 LoginModule 的 JAAS 配置中提到的捆绑包尚未激活。 (请随时发表您对此的想法)
重启时出现错误...
27.06.2020 14:28:45.985 错误 [Apache Sling 资源提供程序更改通知程序] org.apache.sling.extensions.threaddump.internal.Activator 线程线程中未捕获的异常[Apache Sling 资源提供程序Change Notifier,5,main] java.lang.AssertionError:不存在从 org.apache.sling.auth.saml2.sp.Saml2LoginModule 创建 LoginModule 的包 在 org.apache.felix.jaas.internal.BundleLoginModuleCreator.newInstance(BundleLoginModuleCreator.java:59) [org.apache.felix.jaas:1.0.2] 在 org.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.run(LoginContext.java:665) 在 java.base/javax.security.auth.login.LoginContext$4.run(LoginContext.java:663) 在 java.base/java.security.AccessController.doPrivileged(本机方法) 在 java.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.authenticate(JcrResourceProvider.java:303) [org.apache.sling.jcr.resource:3.0.20] 在 org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.authenticate(JcrResourceProvider.java:75) [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.access $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 配置,该配置正确绑定而不会导致应用程序启动出现问题?
【问题讨论】:
标签: apache-felix sling