首页 > 解决方案 > 在 Felix OSGI 中使用 Java 创建 JAAS 配置

问题描述

我想在 Apache Sling 中为 SAML2 登录包设置默认 JAAS 配置(不使用/system/console/configMgrUI)

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 配置,而不会导致应用程序启动出现问题?

标签: apache-felixsling

解决方案


诚然,我的“问题”与发布的确切“问题”略有不同。关于这个问题,我仍然想知道如何使用 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);

推荐阅读