Search in sources :

Example 1 with Spi

use of org.keycloak.provider.Spi in project keycloak by keycloak.

the class ServerInfoAdminResource method setProviders.

private void setProviders(ServerInfoRepresentation info) {
    info.setComponentTypes(new HashMap<>());
    LinkedHashMap<String, SpiInfoRepresentation> spiReps = new LinkedHashMap<>();
    List<Spi> spis = new LinkedList<>(session.getKeycloakSessionFactory().getSpis());
    Collections.sort(spis, new Comparator<Spi>() {

        @Override
        public int compare(Spi s1, Spi s2) {
            return s1.getName().compareTo(s2.getName());
        }
    });
    for (Spi spi : spis) {
        SpiInfoRepresentation spiRep = new SpiInfoRepresentation();
        spiRep.setInternal(spi.isInternal());
        List<String> providerIds = new LinkedList<>(session.listProviderIds(spi.getProviderClass()));
        Collections.sort(providerIds);
        Map<String, ProviderRepresentation> providers = new HashMap<>();
        if (providerIds != null) {
            for (String name : providerIds) {
                ProviderRepresentation provider = new ProviderRepresentation();
                ProviderFactory<?> pi = session.getKeycloakSessionFactory().getProviderFactory(spi.getProviderClass(), name);
                provider.setOrder(pi.order());
                if (ServerInfoAwareProviderFactory.class.isAssignableFrom(pi.getClass())) {
                    provider.setOperationalInfo(((ServerInfoAwareProviderFactory) pi).getOperationalInfo());
                }
                if (pi instanceof ConfiguredProvider) {
                    ComponentTypeRepresentation rep = new ComponentTypeRepresentation();
                    rep.setId(pi.getId());
                    ConfiguredProvider configured = (ConfiguredProvider) pi;
                    rep.setHelpText(configured.getHelpText());
                    List<ProviderConfigProperty> configProperties = configured.getConfigProperties();
                    if (configProperties == null)
                        configProperties = Collections.EMPTY_LIST;
                    rep.setProperties(ModelToRepresentation.toRepresentation(configProperties));
                    if (pi instanceof ComponentFactory) {
                        rep.setMetadata(((ComponentFactory) pi).getTypeMetadata());
                    }
                    List<ComponentTypeRepresentation> reps = info.getComponentTypes().get(spi.getProviderClass().getName());
                    if (reps == null) {
                        reps = new LinkedList<>();
                        info.getComponentTypes().put(spi.getProviderClass().getName(), reps);
                    }
                    reps.add(rep);
                }
                providers.put(name, provider);
            }
        }
        spiRep.setProviders(providers);
        spiReps.put(spi.getName(), spiRep);
    }
    info.setProviders(spiReps);
}
Also used : SpiInfoRepresentation(org.keycloak.representations.info.SpiInfoRepresentation) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) ProviderConfigProperty(org.keycloak.provider.ProviderConfigProperty) ComponentFactory(org.keycloak.component.ComponentFactory) ProviderRepresentation(org.keycloak.representations.info.ProviderRepresentation) Spi(org.keycloak.provider.Spi) LinkedList(java.util.LinkedList) LinkedHashMap(java.util.LinkedHashMap) ConfiguredProvider(org.keycloak.provider.ConfiguredProvider) ComponentTypeRepresentation(org.keycloak.representations.idm.ComponentTypeRepresentation)

Example 2 with Spi

use of org.keycloak.provider.Spi in project keycloak by keycloak.

the class KeycloakModelTest method createKeycloakSessionFactory.

/**
 * Creates a fresh initialized {@link KeycloakSessionFactory}. The returned factory uses configuration
 * local to the thread that calls this method, allowing for per-thread customization. This in turn allows
 * testing of several parallel session factories which can be used to simulate several servers
 * running in parallel.
 * @return
 */
public static KeycloakSessionFactory createKeycloakSessionFactory() {
    int factoryIndex = FACTORY_COUNT.incrementAndGet();
    String threadName = Thread.currentThread().getName();
    CONFIG.reset();
    CONFIG.spi(ComponentFactorySpi.NAME).provider(DefaultComponentFactoryProviderFactory.PROVIDER_ID).config("cachingForced", "true");
    MODEL_PARAMETERS.forEach(m -> m.updateConfig(CONFIG));
    LOG.debugf("Creating factory %d in %s using the following configuration:\n    %s", factoryIndex, threadName, CONFIG);
    DefaultKeycloakSessionFactory res = new DefaultKeycloakSessionFactory() {

        @Override
        protected boolean isEnabled(ProviderFactory factory, Scope scope) {
            return super.isEnabled(factory, scope) && isFactoryAllowed(factory);
        }

        @Override
        protected Map<Class<? extends Provider>, Map<String, ProviderFactory>> loadFactories(ProviderManager pm) {
            spis.removeIf(s -> !isSpiAllowed(s));
            return super.loadFactories(pm);
        }

        private boolean isSpiAllowed(Spi s) {
            return MODEL_PARAMETERS.stream().anyMatch(p -> p.isSpiAllowed(s));
        }

        private boolean isFactoryAllowed(ProviderFactory factory) {
            return MODEL_PARAMETERS.stream().anyMatch(p -> p.isFactoryAllowed(factory));
        }

        @Override
        public String toString() {
            return "KeycloakSessionFactory " + factoryIndex + " (from " + threadName + " thread)";
        }
    };
    res.init();
    res.publish(new PostMigrationEvent());
    return res;
}
Also used : DefaultKeycloakSessionFactory(org.keycloak.services.DefaultKeycloakSessionFactory) Scope(org.keycloak.Config.Scope) DefaultExecutorsProviderFactory(org.keycloak.executors.DefaultExecutorsProviderFactory) ComponentFactoryProviderFactory(org.keycloak.component.ComponentFactoryProviderFactory) DefaultAuthorizationProviderFactory(org.keycloak.authorization.DefaultAuthorizationProviderFactory) DefaultComponentFactoryProviderFactory(org.keycloak.services.DefaultComponentFactoryProviderFactory) ProviderFactory(org.keycloak.provider.ProviderFactory) DeploymentStateProviderFactory(org.keycloak.models.DeploymentStateProviderFactory) ProviderManager(org.keycloak.provider.ProviderManager) BeforeClass(org.junit.BeforeClass) Map(java.util.Map) ComponentFactorySpi(org.keycloak.component.ComponentFactorySpi) ClientScopeSpi(org.keycloak.models.ClientScopeSpi) ExecutorsSpi(org.keycloak.executors.ExecutorsSpi) DBLockSpi(org.keycloak.models.dblock.DBLockSpi) ClusterSpi(org.keycloak.cluster.ClusterSpi) UserSpi(org.keycloak.models.UserSpi) Spi(org.keycloak.provider.Spi) UserLoginFailureSpi(org.keycloak.models.UserLoginFailureSpi) TimerSpi(org.keycloak.timer.TimerSpi) ClientSpi(org.keycloak.models.ClientSpi) StoreFactorySpi(org.keycloak.authorization.store.StoreFactorySpi) RealmSpi(org.keycloak.models.RealmSpi) GroupSpi(org.keycloak.models.GroupSpi) UserSessionSpi(org.keycloak.models.UserSessionSpi) DeploymentStateSpi(org.keycloak.models.DeploymentStateSpi) EventStoreSpi(org.keycloak.events.EventStoreSpi) AuthorizationSpi(org.keycloak.authorization.AuthorizationSpi) RoleSpi(org.keycloak.models.RoleSpi) Provider(org.keycloak.provider.Provider) PostMigrationEvent(org.keycloak.models.utils.PostMigrationEvent)

Example 3 with Spi

use of org.keycloak.provider.Spi in project keycloak by keycloak.

the class FeatureDeployerUtil method createDeploymentInfo.

private static KeycloakDeploymentInfo createDeploymentInfo(Map<ProviderFactory, Spi> factories) {
    KeycloakDeploymentInfo di = KeycloakDeploymentInfo.create();
    for (Map.Entry<ProviderFactory, Spi> factory : factories.entrySet()) {
        ProviderFactory pf = factory.getKey();
        Class<? extends Spi> spiClass = factory.getValue().getClass();
        di.addProvider(spiClass, pf);
    }
    return di;
}
Also used : KeycloakDeploymentInfo(org.keycloak.provider.KeycloakDeploymentInfo) EnvironmentDependentProviderFactory(org.keycloak.provider.EnvironmentDependentProviderFactory) ProviderFactory(org.keycloak.provider.ProviderFactory) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) Map(java.util.Map) Spi(org.keycloak.provider.Spi)

Example 4 with Spi

use of org.keycloak.provider.Spi in project keycloak by keycloak.

the class FeatureDeployerUtil method deployFactoriesAfterFeatureEnabled.

public static void deployFactoriesAfterFeatureEnabled(Profile.Feature feature) {
    ProviderManager manager = deployersCache.get(feature);
    if (manager == null) {
        // Need to figure which provider factories were enabled after feature was enabled. Create deployer based on it and save it to the cache
        Map<ProviderFactory, Spi> factoriesBeforeEnable = initializer.remove(feature);
        Map<ProviderFactory, Spi> factoriesAfterEnable = loadEnabledEnvironmentFactories();
        Map<ProviderFactory, Spi> factories = getFactoriesDependentOnFeature(factoriesBeforeEnable, factoriesAfterEnable);
        logger.infof("New factories when enabling feature '%s': %s", feature, factories.keySet());
        KeycloakDeploymentInfo di = createDeploymentInfo(factories);
        manager = new ProviderManager(di, FeatureDeployerUtil.class.getClassLoader());
        deployersCache.put(feature, manager);
    }
    ProviderManagerRegistry.SINGLETON.deploy(manager);
}
Also used : KeycloakDeploymentInfo(org.keycloak.provider.KeycloakDeploymentInfo) ProviderManager(org.keycloak.provider.ProviderManager) EnvironmentDependentProviderFactory(org.keycloak.provider.EnvironmentDependentProviderFactory) ProviderFactory(org.keycloak.provider.ProviderFactory) Spi(org.keycloak.provider.Spi)

Example 5 with Spi

use of org.keycloak.provider.Spi in project keycloak by keycloak.

the class DefaultKeycloakSessionFactory method checkProvider.

protected void checkProvider() {
    // make sure to recreated the default providers map
    provider.clear();
    for (Spi spi : spis) {
        String defaultProvider = Config.getProvider(spi.getName());
        if (defaultProvider != null) {
            if (getProviderFactory(spi.getProviderClass(), defaultProvider) == null) {
                throw new RuntimeException("Failed to find provider " + defaultProvider + " for " + spi.getName());
            }
        } else {
            Map<String, ProviderFactory> factories = factoriesMap.get(spi.getProviderClass());
            if (factories != null && factories.size() == 1) {
                defaultProvider = factories.values().iterator().next().getId();
            }
            if (defaultProvider == null) {
                Optional<ProviderFactory> highestPriority = factories.values().stream().max(Comparator.comparing(ProviderFactory::order));
                if (highestPriority.isPresent() && highestPriority.get().order() > 0) {
                    defaultProvider = highestPriority.get().getId();
                }
            }
            if (defaultProvider == null && factories.containsKey("default")) {
                defaultProvider = "default";
            }
        }
        if (defaultProvider != null) {
            this.provider.put(spi.getProviderClass(), defaultProvider);
            logger.debugv("Set default provider for {0} to {1}", spi.getName(), defaultProvider);
        } else {
            logger.debugv("No default provider for {0}", spi.getName());
        }
    }
}
Also used : EnvironmentDependentProviderFactory(org.keycloak.provider.EnvironmentDependentProviderFactory) ComponentFactoryProviderFactory(org.keycloak.component.ComponentFactoryProviderFactory) ProviderFactory(org.keycloak.provider.ProviderFactory) Spi(org.keycloak.provider.Spi)

Aggregations

Spi (org.keycloak.provider.Spi)11 ProviderFactory (org.keycloak.provider.ProviderFactory)10 EnvironmentDependentProviderFactory (org.keycloak.provider.EnvironmentDependentProviderFactory)9 HashMap (java.util.HashMap)7 Map (java.util.Map)6 KeycloakDeploymentInfo (org.keycloak.provider.KeycloakDeploymentInfo)6 ProviderManager (org.keycloak.provider.ProviderManager)6 Provider (org.keycloak.provider.Provider)5 Config (org.keycloak.Config)3 JdbcDataSourceBuildItem (io.quarkus.agroal.spi.JdbcDataSourceBuildItem)2 DevServicesDatasourceResultBuildItem (io.quarkus.datasource.deployment.spi.DevServicesDatasourceResultBuildItem)2 IsDevelopment (io.quarkus.deployment.IsDevelopment)2 BuildProducer (io.quarkus.deployment.annotations.BuildProducer)2 BuildStep (io.quarkus.deployment.annotations.BuildStep)2 Consume (io.quarkus.deployment.annotations.Consume)2 ExecutionTime (io.quarkus.deployment.annotations.ExecutionTime)2 Record (io.quarkus.deployment.annotations.Record)2 CombinedIndexBuildItem (io.quarkus.deployment.builditem.CombinedIndexBuildItem)2 FeatureBuildItem (io.quarkus.deployment.builditem.FeatureBuildItem)2 GeneratedResourceBuildItem (io.quarkus.deployment.builditem.GeneratedResourceBuildItem)2