【问题标题】:Creating JAAS Configuration Using Java in Felix OSGI在 Felix OSGI 中使用 Java 创建 JAAS 配置
【发布时间】: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


    【解决方案1】:

    诚然,我的“问题”与发布的确切“问题”略有不同。关于这个问题,我仍然想知道如何使用 Java 代码为 bundle 编写 Felix OSGI 配置。

    这篇文章有一个解决方案 How is the OSGi bundle start level defined? 关于设置捆绑启动值。 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);
    

    【讨论】:

      猜你喜欢
      • 2013-03-23
      • 2010-11-12
      • 1970-01-01
      • 2012-03-08
      • 2015-04-12
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2013-03-24
      相关资源
      最近更新 更多