KEYCLOAK-856 Merge WildFly and EAP subsystems
This commit is contained in:
parent
8abbcca76b
commit
f537661341
14 changed files with 388 additions and 46 deletions
|
@ -43,7 +43,10 @@
|
||||||
<module name="org.jboss.msc"/>
|
<module name="org.jboss.msc"/>
|
||||||
<module name="org.jboss.logging"/>
|
<module name="org.jboss.logging"/>
|
||||||
<module name="org.jboss.vfs"/>
|
<module name="org.jboss.vfs"/>
|
||||||
<module name="org.jboss.as.web-common"/>
|
<module name="org.jboss.as.web-common" optional="true"/>
|
||||||
|
<module name="org.jboss.as.web" optional="true"/>
|
||||||
|
<module name="org.jboss.as.version" optional="true"/>
|
||||||
|
<module name="org.keycloak.keycloak-as7-adapter" optional="true"/>
|
||||||
<module name="org.jboss.metadata"/>
|
<module name="org.jboss.metadata"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</module>
|
</module>
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>keycloak-as7-subsystem</artifactId>
|
<artifactId>keycloak-as7-subsystem</artifactId>
|
||||||
<name>Keycloak Wildfly Subsystem</name>
|
<name>Keycloak Wildfly AS7 Subsystem</name>
|
||||||
<description/>
|
<description/>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,11 @@
|
||||||
<artifactId>wildfly-server</artifactId>
|
<artifactId>wildfly-server</artifactId>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.wildfly.core</groupId>
|
||||||
|
<artifactId>wildfly-version</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.wildfly</groupId>
|
<groupId>org.wildfly</groupId>
|
||||||
<artifactId>wildfly-ee</artifactId>
|
<artifactId>wildfly-ee</artifactId>
|
||||||
|
@ -110,5 +115,17 @@
|
||||||
<artifactId>junit</artifactId>
|
<artifactId>junit</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jboss.as</groupId>
|
||||||
|
<artifactId>jboss-as-web</artifactId>
|
||||||
|
<version>7.1.1.Final</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.keycloak</groupId>
|
||||||
|
<artifactId>keycloak-as7-adapter</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Red Hat Inc. and/or its affiliates and other contributors
|
||||||
|
* as indicated by the @author tags. All rights reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||||
|
* use this file except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations under
|
||||||
|
* the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.keycloak.subsystem.extension;
|
||||||
|
|
||||||
|
import org.jboss.as.version.Version;
|
||||||
|
import org.jboss.modules.Module;
|
||||||
|
import org.jboss.modules.ModuleIdentifier;
|
||||||
|
import org.jboss.modules.ModuleLoadException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows the Keycloak subsystem to learn about its environment.
|
||||||
|
*
|
||||||
|
* @author Stan Silvert ssilvert@redhat.com (C) 2014 Red Hat Inc.
|
||||||
|
*/
|
||||||
|
public class Environment {
|
||||||
|
private static final ModuleIdentifier KEYCLOAK_SUBSYSTEM = ModuleIdentifier.create("org.keycloak.keycloak-wildfly-subsystem");
|
||||||
|
|
||||||
|
private static final boolean isWildFly = findIsWildFly();
|
||||||
|
|
||||||
|
public Environment() {
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean findIsWildFly() {
|
||||||
|
try {
|
||||||
|
return !Version.AS_VERSION.startsWith("7");
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Module getSubsysModule() {
|
||||||
|
// Unfortunately, we can't cache this because unit tests will fail
|
||||||
|
try {
|
||||||
|
return Module.getModuleFromCallerModuleLoader(KEYCLOAK_SUBSYSTEM);
|
||||||
|
} catch (ModuleLoadException e) {
|
||||||
|
throw new IllegalStateException("Can't find Keycloak subsystem.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isWildFly() {
|
||||||
|
return isWildFly;
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,7 +21,6 @@ import org.jboss.as.server.deployment.DeploymentPhaseContext;
|
||||||
import org.jboss.as.server.deployment.DeploymentUnit;
|
import org.jboss.as.server.deployment.DeploymentUnit;
|
||||||
import org.jboss.as.server.deployment.DeploymentUnitProcessingException;
|
import org.jboss.as.server.deployment.DeploymentUnitProcessingException;
|
||||||
import org.jboss.as.server.deployment.DeploymentUnitProcessor;
|
import org.jboss.as.server.deployment.DeploymentUnitProcessor;
|
||||||
import org.jboss.as.server.deployment.Phase;
|
|
||||||
import org.jboss.as.web.common.WarMetaData;
|
import org.jboss.as.web.common.WarMetaData;
|
||||||
import org.jboss.logging.Logger;
|
import org.jboss.logging.Logger;
|
||||||
import org.jboss.metadata.javaee.spec.ParamValueMetaData;
|
import org.jboss.metadata.javaee.spec.ParamValueMetaData;
|
||||||
|
@ -31,10 +30,6 @@ import org.keycloak.subsystem.logging.KeycloakLogger;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import org.jboss.as.ee.component.EEModuleDescription;
|
|
||||||
import org.jboss.as.server.deployment.Attachments;
|
|
||||||
import org.jboss.as.server.deployment.MountedDeploymentOverlay;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pass authentication data (keycloak.json) as a servlet context param so it can be read by the KeycloakServletExtension.
|
* Pass authentication data (keycloak.json) as a servlet context param so it can be read by the KeycloakServletExtension.
|
||||||
|
@ -49,10 +44,6 @@ public class KeycloakAdapterConfigDeploymentProcessor implements DeploymentUnitP
|
||||||
// two places to avoid dependency between Keycloak Subsystem and Keyclaok Undertow Integration.
|
// two places to avoid dependency between Keycloak Subsystem and Keyclaok Undertow Integration.
|
||||||
public static final String AUTH_DATA_PARAM_NAME = "org.keycloak.json.adapterConfig";
|
public static final String AUTH_DATA_PARAM_NAME = "org.keycloak.json.adapterConfig";
|
||||||
|
|
||||||
public static final Phase PHASE = Phase.POST_MODULE;
|
|
||||||
// This needs to run just before bean validator factory
|
|
||||||
public static final int PRIORITY = Phase.POST_MODULE_VALIDATOR_FACTORY - 1;
|
|
||||||
|
|
||||||
// not sure if we need this yet, keeping here just in case
|
// not sure if we need this yet, keeping here just in case
|
||||||
protected void addSecurityDomain(DeploymentUnit deploymentUnit, KeycloakAdapterConfigService service) {
|
protected void addSecurityDomain(DeploymentUnit deploymentUnit, KeycloakAdapterConfigService service) {
|
||||||
String deploymentName = deploymentUnit.getName();
|
String deploymentName = deploymentUnit.getName();
|
||||||
|
@ -83,12 +74,6 @@ public class KeycloakAdapterConfigDeploymentProcessor implements DeploymentUnitP
|
||||||
addKeycloakAuthData(phaseContext, deploymentName, service);
|
addKeycloakAuthData(phaseContext, deploymentName, service);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (service.isKeycloakServerDeployment(deploymentName)) {
|
|
||||||
final EEModuleDescription description = deploymentUnit.getAttachment(org.jboss.as.ee.component.Attachments.EE_MODULE_DESCRIPTION);
|
|
||||||
String webContext = service.getWebContext(deploymentName);
|
|
||||||
if (webContext == null) throw new DeploymentUnitProcessingException("Can't determine web context/module for Keycloak Auth Server");
|
|
||||||
description.setModuleName(webContext);
|
|
||||||
}
|
|
||||||
// FYI, Undertow Extension will find deployments that have auth-method set to KEYCLOAK
|
// FYI, Undertow Extension will find deployments that have auth-method set to KEYCLOAK
|
||||||
|
|
||||||
// todo notsure if we need this
|
// todo notsure if we need this
|
||||||
|
|
|
@ -0,0 +1,132 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Red Hat Inc. and/or its affiliates and other contributors
|
||||||
|
* as indicated by the @author tags. All rights reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||||
|
* use this file except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations under
|
||||||
|
* the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.keycloak.subsystem.extension;
|
||||||
|
|
||||||
|
import org.jboss.as.server.deployment.DeploymentPhaseContext;
|
||||||
|
import org.jboss.as.server.deployment.DeploymentUnit;
|
||||||
|
import org.jboss.as.server.deployment.DeploymentUnitProcessingException;
|
||||||
|
import org.jboss.as.server.deployment.DeploymentUnitProcessor;
|
||||||
|
import org.jboss.as.web.deployment.WarMetaData;
|
||||||
|
import org.jboss.logging.Logger;
|
||||||
|
import org.jboss.metadata.javaee.spec.ParamValueMetaData;
|
||||||
|
import org.jboss.metadata.web.jboss.JBossWebMetaData;
|
||||||
|
import org.jboss.metadata.web.jboss.ValveMetaData;
|
||||||
|
import org.jboss.metadata.web.spec.LoginConfigMetaData;
|
||||||
|
import org.keycloak.adapters.as7.KeycloakAuthenticatorValve;
|
||||||
|
import org.keycloak.subsystem.logging.KeycloakLogger;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pass authentication data (keycloak.json) as a servlet context param so it can be read by the KeycloakServletExtension.
|
||||||
|
* This is used for AS7/EAP6.
|
||||||
|
*
|
||||||
|
* @author Stan Silvert ssilvert@redhat.com (C) 2014 Red Hat Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Note: Even though this class closely resembles the WildFly KeycloakAdapterConfigDeploymentProcessor
|
||||||
|
// it can not be easily refactored because the WarMetaData classes are of different types.
|
||||||
|
public class KeycloakAdapterConfigDeploymentProcessorAS7 implements DeploymentUnitProcessor {
|
||||||
|
protected Logger log = Logger.getLogger(KeycloakAdapterConfigDeploymentProcessorAS7.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException {
|
||||||
|
DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
|
||||||
|
String deploymentName = deploymentUnit.getName();
|
||||||
|
|
||||||
|
KeycloakAdapterConfigService service = KeycloakAdapterConfigService.find(phaseContext.getServiceRegistry());
|
||||||
|
//log.info("********* CHECK KEYCLOAK DEPLOYMENT: " + deploymentName);
|
||||||
|
if (service.isSecureDeployment(deploymentName)) {
|
||||||
|
addKeycloakAuthData(phaseContext, deploymentName, service);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// else check to see if KEYCLOAK is specified as login config
|
||||||
|
WarMetaData warMetaData = deploymentUnit.getAttachment(WarMetaData.ATTACHMENT_KEY);
|
||||||
|
if (warMetaData == null) return;
|
||||||
|
JBossWebMetaData webMetaData = warMetaData.getMergedJBossWebMetaData();
|
||||||
|
if (webMetaData == null) return;
|
||||||
|
|
||||||
|
LoginConfigMetaData loginConfig = webMetaData.getLoginConfig();
|
||||||
|
if (loginConfig != null && "KEYCLOAK".equalsIgnoreCase(loginConfig.getAuthMethod())) {
|
||||||
|
addValve(webMetaData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addKeycloakAuthData(DeploymentPhaseContext phaseContext, String deploymentName, KeycloakAdapterConfigService service) {
|
||||||
|
DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
|
||||||
|
WarMetaData warMetaData = deploymentUnit.getAttachment(WarMetaData.ATTACHMENT_KEY);
|
||||||
|
|
||||||
|
addJSONData(service.getJSON(deploymentName), warMetaData);
|
||||||
|
JBossWebMetaData webMetaData = warMetaData.getMergedJBossWebMetaData();
|
||||||
|
if (webMetaData == null) {
|
||||||
|
webMetaData = new JBossWebMetaData();
|
||||||
|
warMetaData.setMergedJBossWebMetaData(webMetaData);
|
||||||
|
}
|
||||||
|
addValve(webMetaData);
|
||||||
|
|
||||||
|
LoginConfigMetaData loginConfig = webMetaData.getLoginConfig();
|
||||||
|
if (loginConfig == null) {
|
||||||
|
loginConfig = new LoginConfigMetaData();
|
||||||
|
webMetaData.setLoginConfig(loginConfig);
|
||||||
|
}
|
||||||
|
loginConfig.setAuthMethod("KEYCLOAK");
|
||||||
|
loginConfig.setRealmName(service.getRealmName(deploymentName));
|
||||||
|
KeycloakLogger.ROOT_LOGGER.deploymentSecured(deploymentName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addValve(JBossWebMetaData webMetaData) {
|
||||||
|
List<ValveMetaData> valves = webMetaData.getValves();
|
||||||
|
if (valves == null) {
|
||||||
|
valves = new ArrayList<ValveMetaData>(1);
|
||||||
|
webMetaData.setValves(valves);
|
||||||
|
}
|
||||||
|
ValveMetaData valve = new ValveMetaData();
|
||||||
|
valve.setValveClass(KeycloakAuthenticatorValve.class.getName());
|
||||||
|
valve.setModule("org.keycloak.keycloak-as7-adapter");
|
||||||
|
//log.info("******* adding Keycloak valve to: " + deploymentName);
|
||||||
|
valves.add(valve);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addJSONData(String json, WarMetaData warMetaData) {
|
||||||
|
JBossWebMetaData webMetaData = warMetaData.getMergedJBossWebMetaData();
|
||||||
|
if (webMetaData == null) {
|
||||||
|
webMetaData = new JBossWebMetaData();
|
||||||
|
warMetaData.setMergedJBossWebMetaData(webMetaData);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<ParamValueMetaData> contextParams = webMetaData.getContextParams();
|
||||||
|
if (contextParams == null) {
|
||||||
|
contextParams = new ArrayList<ParamValueMetaData>();
|
||||||
|
}
|
||||||
|
|
||||||
|
ParamValueMetaData param = new ParamValueMetaData();
|
||||||
|
param.setParamName(KeycloakAdapterConfigDeploymentProcessor.AUTH_DATA_PARAM_NAME);
|
||||||
|
param.setParamValue(json);
|
||||||
|
contextParams.add(param);
|
||||||
|
|
||||||
|
webMetaData.setContextParams(contextParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void undeploy(DeploymentUnit du) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -224,7 +224,7 @@ public final class KeycloakAdapterConfigService implements Service<KeycloakAdapt
|
||||||
return this.webContexts.containsKey(deploymentName);
|
return this.webContexts.containsKey(deploymentName);
|
||||||
}
|
}
|
||||||
|
|
||||||
static KeycloakAdapterConfigService find(ServiceRegistry registry) {
|
public static KeycloakAdapterConfigService find(ServiceRegistry registry) {
|
||||||
ServiceController<?> container = registry.getService(KeycloakAdapterConfigService.SERVICE_NAME);
|
ServiceController<?> container = registry.getService(KeycloakAdapterConfigService.SERVICE_NAME);
|
||||||
if (container != null) {
|
if (container != null) {
|
||||||
KeycloakAdapterConfigService service = (KeycloakAdapterConfigService)container.getValue();
|
KeycloakAdapterConfigService service = (KeycloakAdapterConfigService)container.getValue();
|
||||||
|
@ -233,7 +233,7 @@ public final class KeycloakAdapterConfigService implements Service<KeycloakAdapt
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
static KeycloakAdapterConfigService find(OperationContext context) {
|
public static KeycloakAdapterConfigService find(OperationContext context) {
|
||||||
return find(context.getServiceRegistry(true));
|
return find(context.getServiceRegistry(true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,37 +32,33 @@ import org.jboss.modules.ModuleLoader;
|
||||||
*
|
*
|
||||||
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
* @author Stan Silvert ssilvert@redhat.com (C) 2013 Red Hat Inc.
|
||||||
*/
|
*/
|
||||||
public class KeycloakDependencyProcessor implements DeploymentUnitProcessor {
|
public abstract class KeycloakDependencyProcessor implements DeploymentUnitProcessor {
|
||||||
|
|
||||||
private static final ModuleIdentifier KEYCLOAK_WILDFLY_ADAPTER = ModuleIdentifier.create("org.keycloak.keycloak-wildfly-adapter");
|
|
||||||
private static final ModuleIdentifier KEYCLOAK_UNDERTOW_ADAPTER = ModuleIdentifier.create("org.keycloak.keycloak-undertow-adapter");
|
|
||||||
private static final ModuleIdentifier KEYCLOAK_JBOSS_CORE_ADAPTER = ModuleIdentifier.create("org.keycloak.keycloak-jboss-adapter-core");
|
private static final ModuleIdentifier KEYCLOAK_JBOSS_CORE_ADAPTER = ModuleIdentifier.create("org.keycloak.keycloak-jboss-adapter-core");
|
||||||
private static final ModuleIdentifier KEYCLOAK_CORE_ADAPTER = ModuleIdentifier.create("org.keycloak.keycloak-adapter-core");
|
private static final ModuleIdentifier KEYCLOAK_CORE_ADAPTER = ModuleIdentifier.create("org.keycloak.keycloak-adapter-core");
|
||||||
private static final ModuleIdentifier KEYCLOAK_CORE = ModuleIdentifier.create("org.keycloak.keycloak-core");
|
private static final ModuleIdentifier KEYCLOAK_CORE = ModuleIdentifier.create("org.keycloak.keycloak-core");
|
||||||
private static final ModuleIdentifier APACHE_HTTPCOMPONENTS = ModuleIdentifier.create("org.apache.httpcomponents");
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException {
|
public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException {
|
||||||
final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
|
final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
|
||||||
|
|
||||||
String deploymentName = deploymentUnit.getName();
|
// Next phase, need to detect if this is a Keycloak deployment. If not, don't add the modules.
|
||||||
KeycloakAdapterConfigService service = KeycloakAdapterConfigService.find(phaseContext.getServiceRegistry());
|
|
||||||
|
|
||||||
addModules(deploymentUnit);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addModules(DeploymentUnit deploymentUnit) {
|
|
||||||
final ModuleSpecification moduleSpecification = deploymentUnit.getAttachment(Attachments.MODULE_SPECIFICATION);
|
final ModuleSpecification moduleSpecification = deploymentUnit.getAttachment(Attachments.MODULE_SPECIFICATION);
|
||||||
final ModuleLoader moduleLoader = Module.getBootModuleLoader();
|
final ModuleLoader moduleLoader = Module.getBootModuleLoader();
|
||||||
|
addCommonModules(moduleSpecification, moduleLoader);
|
||||||
|
addPlatformSpecificModules(moduleSpecification, moduleLoader);
|
||||||
|
}
|
||||||
|
|
||||||
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, KEYCLOAK_WILDFLY_ADAPTER, false, false, true, false));
|
private void addCommonModules(ModuleSpecification moduleSpecification, ModuleLoader moduleLoader) {
|
||||||
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, KEYCLOAK_UNDERTOW_ADAPTER, false, false, false, false));
|
// ModuleDependency(ModuleLoader moduleLoader, ModuleIdentifier identifier, boolean optional, boolean export, boolean importServices, boolean userSpecified)
|
||||||
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, KEYCLOAK_JBOSS_CORE_ADAPTER, false, false, false, false));
|
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, KEYCLOAK_JBOSS_CORE_ADAPTER, false, false, false, false));
|
||||||
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, KEYCLOAK_CORE_ADAPTER, false, false, false, false));
|
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, KEYCLOAK_CORE_ADAPTER, false, false, false, false));
|
||||||
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, KEYCLOAK_CORE, false, false, false, false));
|
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, KEYCLOAK_CORE, false, false, false, false));
|
||||||
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, APACHE_HTTPCOMPONENTS, false, false, true, false));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
abstract protected void addPlatformSpecificModules(ModuleSpecification moduleSpecification, ModuleLoader moduleLoader);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void undeploy(DeploymentUnit du) {
|
public void undeploy(DeploymentUnit du) {
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors
|
||||||
|
* as indicated by the @author tags. All rights reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||||
|
* use this file except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations under
|
||||||
|
* the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.keycloak.subsystem.extension;
|
||||||
|
|
||||||
|
import org.jboss.as.server.deployment.module.ModuleDependency;
|
||||||
|
import org.jboss.as.server.deployment.module.ModuleSpecification;
|
||||||
|
import org.jboss.modules.ModuleIdentifier;
|
||||||
|
import org.jboss.modules.ModuleLoader;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds platform-specific modules for AS7
|
||||||
|
*
|
||||||
|
* @author Stan Silvert ssilvert@redhat.com (C) 2014 Red Hat Inc.
|
||||||
|
*/
|
||||||
|
public class KeycloakDependencyProcessorAS7 extends KeycloakDependencyProcessor {
|
||||||
|
|
||||||
|
private static final ModuleIdentifier KEYCLOAK_AS7_ADAPTER = ModuleIdentifier.create("org.keycloak.keycloak-as7-adapter");
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addPlatformSpecificModules(ModuleSpecification moduleSpecification, ModuleLoader moduleLoader) {
|
||||||
|
// ModuleDependency(ModuleLoader moduleLoader, ModuleIdentifier identifier, boolean optional, boolean export, boolean importServices, boolean userSpecified)
|
||||||
|
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, KEYCLOAK_AS7_ADAPTER, false, false, true, false));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors
|
||||||
|
* as indicated by the @author tags. All rights reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||||
|
* use this file except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations under
|
||||||
|
* the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.keycloak.subsystem.extension;
|
||||||
|
|
||||||
|
import org.jboss.as.server.deployment.module.ModuleDependency;
|
||||||
|
import org.jboss.as.server.deployment.module.ModuleSpecification;
|
||||||
|
import org.jboss.modules.ModuleIdentifier;
|
||||||
|
import org.jboss.modules.ModuleLoader;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add platform-specific modules for WildFly.
|
||||||
|
*
|
||||||
|
* @author Stan Silvert ssilvert@redhat.com (C) 2014 Red Hat Inc.
|
||||||
|
*/
|
||||||
|
public class KeycloakDependencyProcessorWildFly extends KeycloakDependencyProcessor {
|
||||||
|
|
||||||
|
private static final ModuleIdentifier KEYCLOAK_WILDFLY_ADAPTER = ModuleIdentifier.create("org.keycloak.keycloak-wildfly-adapter");
|
||||||
|
private static final ModuleIdentifier KEYCLOAK_UNDERTOW_ADAPTER = ModuleIdentifier.create("org.keycloak.keycloak-undertow-adapter");
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addPlatformSpecificModules(ModuleSpecification moduleSpecification, ModuleLoader moduleLoader) {
|
||||||
|
// ModuleDependency(ModuleLoader moduleLoader, ModuleIdentifier identifier, boolean optional, boolean export, boolean importServices, boolean userSpecified)
|
||||||
|
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, KEYCLOAK_WILDFLY_ADAPTER, false, false, true, false));
|
||||||
|
moduleSpecification.addSystemDependency(new ModuleDependency(moduleLoader, KEYCLOAK_UNDERTOW_ADAPTER, false, false, false, false));
|
||||||
|
}
|
||||||
|
}
|
|
@ -29,6 +29,8 @@ import org.jboss.msc.service.ServiceController;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.jboss.as.controller.registry.Resource;
|
import org.jboss.as.controller.registry.Resource;
|
||||||
|
import org.jboss.as.server.deployment.DeploymentUnitProcessor;
|
||||||
|
import org.keycloak.subsystem.extension.authserver.KeycloakServerDeploymentProcessor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Keycloak subsystem add update handler.
|
* The Keycloak subsystem add update handler.
|
||||||
|
@ -51,15 +53,35 @@ class KeycloakSubsystemAdd extends AbstractBoottimeAddStepHandler {
|
||||||
context.addStep(new AbstractDeploymentChainStep() {
|
context.addStep(new AbstractDeploymentChainStep() {
|
||||||
@Override
|
@Override
|
||||||
protected void execute(DeploymentProcessorTarget processorTarget) {
|
protected void execute(DeploymentProcessorTarget processorTarget) {
|
||||||
processorTarget.addDeploymentProcessor(KeycloakExtension.SUBSYSTEM_NAME, Phase.DEPENDENCIES, 0, new KeycloakDependencyProcessor());
|
processorTarget.addDeploymentProcessor(KeycloakExtension.SUBSYSTEM_NAME, Phase.DEPENDENCIES, 0, chooseDependencyProcessor());
|
||||||
processorTarget.addDeploymentProcessor(KeycloakExtension.SUBSYSTEM_NAME,
|
processorTarget.addDeploymentProcessor(KeycloakExtension.SUBSYSTEM_NAME,
|
||||||
KeycloakAdapterConfigDeploymentProcessor.PHASE,
|
Phase.POST_MODULE, // PHASE
|
||||||
KeycloakAdapterConfigDeploymentProcessor.PRIORITY,
|
Phase.POST_MODULE_VALIDATOR_FACTORY - 1, // PRIORITY
|
||||||
new KeycloakAdapterConfigDeploymentProcessor());
|
chooseConfigDeploymentProcessor());
|
||||||
|
processorTarget.addDeploymentProcessor(KeycloakExtension.SUBSYSTEM_NAME,
|
||||||
|
Phase.POST_MODULE, // PHASE
|
||||||
|
Phase.POST_MODULE_VALIDATOR_FACTORY - 1, // PRIORITY
|
||||||
|
new KeycloakServerDeploymentProcessor());
|
||||||
}
|
}
|
||||||
}, OperationContext.Stage.RUNTIME);
|
}, OperationContext.Stage.RUNTIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private DeploymentUnitProcessor chooseDependencyProcessor() {
|
||||||
|
if (Environment.isWildFly()) {
|
||||||
|
return new KeycloakDependencyProcessorWildFly();
|
||||||
|
} else {
|
||||||
|
return new KeycloakDependencyProcessorAS7();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private DeploymentUnitProcessor chooseConfigDeploymentProcessor() {
|
||||||
|
if (Environment.isWildFly()) {
|
||||||
|
return new KeycloakAdapterConfigDeploymentProcessor();
|
||||||
|
} else {
|
||||||
|
return new KeycloakAdapterConfigDeploymentProcessorAS7();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void performRuntime(OperationContext context, ModelNode operation, ModelNode model, ServiceVerificationHandler verificationHandler, List<ServiceController<?>> newControllers) throws OperationFailedException {
|
protected void performRuntime(OperationContext context, ModelNode operation, ModelNode model, ServiceVerificationHandler verificationHandler, List<ServiceController<?>> newControllers) throws OperationFailedException {
|
||||||
super.performRuntime(context, operation, model, verificationHandler, newControllers);
|
super.performRuntime(context, operation, model, verificationHandler, newControllers);
|
||||||
|
|
|
@ -56,23 +56,13 @@ public class AuthServerUtil {
|
||||||
|
|
||||||
private static final ModuleIdentifier KEYCLOAK_SUBSYSTEM = ModuleIdentifier.create("org.keycloak.keycloak-wildfly-subsystem");
|
private static final ModuleIdentifier KEYCLOAK_SUBSYSTEM = ModuleIdentifier.create("org.keycloak.keycloak-wildfly-subsystem");
|
||||||
|
|
||||||
private final String authServerName;
|
|
||||||
private final PathAddress pathAddress;
|
|
||||||
private final String deploymentName;
|
private final String deploymentName;
|
||||||
|
|
||||||
//private String overlayName;
|
|
||||||
private final Module subsysModule;
|
private final Module subsysModule;
|
||||||
private final String keycloakVersion;
|
private final String keycloakVersion;
|
||||||
private final boolean isAuthServerExploded;
|
private final boolean isAuthServerExploded;
|
||||||
|
|
||||||
//private File overlaysDir;
|
|
||||||
private final URI authServerUri;
|
private final URI authServerUri;
|
||||||
//private URL serverConfig = null;
|
|
||||||
//private Set<URL> spiUrls = new HashSet<URL>();
|
|
||||||
|
|
||||||
AuthServerUtil(ModelNode operation) {
|
AuthServerUtil(ModelNode operation) {
|
||||||
this.authServerName = getAuthServerName(operation);
|
|
||||||
this.pathAddress = getPathAddress(operation);
|
|
||||||
this.deploymentName = getDeploymentName(operation);
|
this.deploymentName = getDeploymentName(operation);
|
||||||
this.subsysModule = findSubsysModule();
|
this.subsysModule = findSubsysModule();
|
||||||
this.keycloakVersion = subsysModule.getProperty("keycloak-version");
|
this.keycloakVersion = subsysModule.getProperty("keycloak-version");
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Red Hat Inc. and/or its affiliates and other contributors
|
||||||
|
* as indicated by the @author tags. All rights reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||||
|
* use this file except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations under
|
||||||
|
* the License.
|
||||||
|
*/
|
||||||
|
package org.keycloak.subsystem.extension.authserver;
|
||||||
|
|
||||||
|
import org.jboss.as.ee.component.EEModuleDescription;
|
||||||
|
import org.jboss.as.server.deployment.DeploymentPhaseContext;
|
||||||
|
import org.jboss.as.server.deployment.DeploymentUnit;
|
||||||
|
import org.jboss.as.server.deployment.DeploymentUnitProcessingException;
|
||||||
|
import org.jboss.as.server.deployment.DeploymentUnitProcessor;
|
||||||
|
import org.keycloak.subsystem.extension.KeycloakAdapterConfigService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DUP responsible for setting the web context of a Keycloak auth server.
|
||||||
|
*
|
||||||
|
* @author Stan Silvert ssilvert@redhat.com (C) 2014 Red Hat Inc.
|
||||||
|
*/
|
||||||
|
public class KeycloakServerDeploymentProcessor implements DeploymentUnitProcessor {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException {
|
||||||
|
DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
|
||||||
|
String deploymentName = deploymentUnit.getName();
|
||||||
|
KeycloakAdapterConfigService service = KeycloakAdapterConfigService.find(phaseContext.getServiceRegistry());
|
||||||
|
if (!service.isKeycloakServerDeployment(deploymentName)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final EEModuleDescription description = deploymentUnit.getAttachment(org.jboss.as.ee.component.Attachments.EE_MODULE_DESCRIPTION);
|
||||||
|
String webContext = service.getWebContext(deploymentName);
|
||||||
|
if (webContext == null) {
|
||||||
|
throw new DeploymentUnitProcessingException("Can't determine web context/module for Keycloak Auth Server");
|
||||||
|
}
|
||||||
|
description.setModuleName(webContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void undeploy(DeploymentUnit du) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
5
pom.xml
5
pom.xml
|
@ -482,6 +482,11 @@
|
||||||
<type>zip</type>
|
<type>zip</type>
|
||||||
<version>${wildfly.core.version}</version>
|
<version>${wildfly.core.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.wildfly.core</groupId>
|
||||||
|
<artifactId>wildfly-version</artifactId>
|
||||||
|
<version>${wildfly.core.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.wildfly</groupId>
|
<groupId>org.wildfly</groupId>
|
||||||
<artifactId>wildfly-undertow</artifactId>
|
<artifactId>wildfly-undertow</artifactId>
|
||||||
|
|
Loading…
Reference in a new issue