Compare commits
56
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2e93c4724b | ||
|
|
8261ffeeeb | ||
|
|
1e438cdc45 | ||
|
|
d70859ef1b | ||
|
|
3ab8ff2ea1 | ||
|
|
adea414695 | ||
|
|
cace03c3cc | ||
|
|
d55b1d7259 | ||
|
|
78e963688c | ||
|
|
b2df872ad4 | ||
|
|
fea4201f46 | ||
|
|
073a2f4d65 | ||
|
|
06df678d33 | ||
|
|
dd65c231f9 | ||
|
|
ae690e0679 | ||
|
|
06f108df3b | ||
|
|
a8319d1131 | ||
|
|
f800290d89 | ||
|
|
e79de47f5e | ||
|
|
08c22416a2 | ||
|
|
dac5d313b3 | ||
|
|
21d139c6c2 | ||
|
|
e5d997a6c0 | ||
|
|
a2e54dc94f | ||
|
|
28040109ac | ||
|
|
39b6bf62ba | ||
|
|
6a19a8fb7e | ||
|
|
e914b6fe8d | ||
|
|
e5a6dbd77a | ||
|
|
343dc05f82 | ||
|
|
76076cdb3c | ||
|
|
487539542a | ||
|
|
1634bef28a | ||
|
|
6882f7a9c0 | ||
|
|
943c8507f7 | ||
|
|
99119562bb | ||
|
|
5cbe595fe3 | ||
|
|
eb8257a52e | ||
|
|
27d8afe4a7 | ||
|
|
88f21eae87 | ||
|
|
1258923a0d | ||
|
|
344286e037 | ||
|
|
3ced81a2c2 | ||
|
|
032c48fb25 | ||
|
|
f6125a2542 | ||
|
|
49a03a86fb | ||
|
|
e84acd9898 | ||
|
|
8022a74565 | ||
|
|
fdc6fc59b8 | ||
|
|
f3340b113f | ||
|
|
20f24bffc4 | ||
|
|
7ebcc69cb9 | ||
|
|
90e5c7f3eb | ||
|
|
81918713dd | ||
|
|
ddceaaf3d5 | ||
|
|
824b900a43 |
No files matched your search
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
+10
@@ -299,8 +299,18 @@ public class PolicyEnforcer {
|
|||||||
protected PathConfig resolvePathConfig(PathConfig originalConfig, String path) {
|
protected PathConfig resolvePathConfig(PathConfig originalConfig, String path) {
|
||||||
if (originalConfig.hasPattern()) {
|
if (originalConfig.hasPattern()) {
|
||||||
ProtectedResource resource = authzClient.protection().resource();
|
ProtectedResource resource = authzClient.protection().resource();
|
||||||
|
|
||||||
|
// search by an exact match
|
||||||
List<ResourceRepresentation> search = resource.findByUri(path);
|
List<ResourceRepresentation> search = resource.findByUri(path);
|
||||||
|
|
||||||
|
// if exact match not found, try to obtain from current path the parent path.
|
||||||
|
// if path is /resource/1/test and pattern from pathConfig is /resource/{id}/*, parent path is /resource/1
|
||||||
|
// this logic allows to match sub resources of a resource instance (/resource/1) to the parent resource,
|
||||||
|
// so any permission granted to parent also applies to sub resources
|
||||||
|
if (search.isEmpty()) {
|
||||||
|
search = resource.findByUri(buildUriFromTemplate(originalConfig.getPath(), path, true));
|
||||||
|
}
|
||||||
|
|
||||||
if (!search.isEmpty()) {
|
if (!search.isEmpty()) {
|
||||||
ResourceRepresentation targetResource = search.get(0);
|
ResourceRepresentation targetResource = search.get(0);
|
||||||
PathConfig config = PathConfig.createPathConfig(targetResource);
|
PathConfig config = PathConfig.createPathConfig(targetResource);
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-as7-integration-pom</artifactId>
|
<artifactId>keycloak-as7-integration-pom</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-as7-integration-pom</artifactId>
|
<artifactId>keycloak-as7-integration-pom</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-as7-integration-pom</artifactId>
|
<artifactId>keycloak-as7-integration-pom</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<name>Keycloak AS7 / JBoss EAP 6 Integration</name>
|
<name>Keycloak AS7 / JBoss EAP 6 Integration</name>
|
||||||
|
|||||||
@@ -0,0 +1,144 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
||||||
|
~ and other contributors as indicated by the @author tags.
|
||||||
|
~
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<parent>
|
||||||
|
<artifactId>keycloak-fuse7-integration-pom</artifactId>
|
||||||
|
<groupId>org.keycloak</groupId>
|
||||||
|
<version>4.0.0.Beta3</version>
|
||||||
|
<relativePath>../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>keycloak-camel-undertow</artifactId>
|
||||||
|
<name>Keycloak Fuse 7.0 Adapter - Camel + Undertow</name>
|
||||||
|
<packaging>bundle</packaging>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<keycloak.osgi.export>
|
||||||
|
org.keycloak.adapters.camel.undertow;version="${project.version}"
|
||||||
|
</keycloak.osgi.export>
|
||||||
|
<keycloak.osgi.import>
|
||||||
|
org.keycloak.*;version="${project.version}",
|
||||||
|
org.apache.camel.*,
|
||||||
|
org.apache.camel.component.undertow,
|
||||||
|
io.undertow.*,
|
||||||
|
*;resolution:=optional
|
||||||
|
</keycloak.osgi.import>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jboss.logging</groupId>
|
||||||
|
<artifactId>jboss-logging</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.osgi</groupId>
|
||||||
|
<artifactId>org.osgi.core</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.osgi</groupId>
|
||||||
|
<artifactId>org.osgi.enterprise</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.ops4j.pax.web</groupId>
|
||||||
|
<artifactId>pax-web-runtime</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.ops4j.pax.web</groupId>
|
||||||
|
<artifactId>pax-web-spi</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.ops4j.pax.web</groupId>
|
||||||
|
<artifactId>pax-web-api</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.undertow</groupId>
|
||||||
|
<artifactId>undertow-servlet</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.keycloak</groupId>
|
||||||
|
<artifactId>keycloak-undertow-adapter</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.camel</groupId>
|
||||||
|
<artifactId>camel-undertow</artifactId>
|
||||||
|
<version>2.21.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.camel</groupId>
|
||||||
|
<artifactId>camel-core</artifactId>
|
||||||
|
<version>2.21.0</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>${maven.compiler.source}</source>
|
||||||
|
<target>${maven.compiler.target}</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Adding OSGI metadata to the JAR without changing the packaging type. -->
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<archive>
|
||||||
|
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
|
||||||
|
</archive>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.felix</groupId>
|
||||||
|
<artifactId>maven-bundle-plugin</artifactId>
|
||||||
|
<extensions>true</extensions>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>bundle-manifest</id>
|
||||||
|
<phase>process-classes</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>manifest</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<instructions>
|
||||||
|
<Bundle-Name>${project.name}</Bundle-Name>
|
||||||
|
<Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
|
||||||
|
<Import-Package>${keycloak.osgi.import}</Import-Package>
|
||||||
|
<Export-Package>${keycloak.osgi.export}</Export-Package>
|
||||||
|
<Export-Service>org.apache.camel.spi.ComponentResolver;component=undertow-keycloak</Export-Service>
|
||||||
|
</instructions>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
+187
@@ -0,0 +1,187 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 Red Hat, Inc. and/or its affiliates
|
||||||
|
* and other contributors as indicated by the @author tags.
|
||||||
|
*
|
||||||
|
* 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.adapters.camel.undertow;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
import org.apache.camel.CamelContext;
|
||||||
|
import org.apache.camel.Consumer;
|
||||||
|
import org.apache.camel.Processor;
|
||||||
|
import org.apache.camel.component.undertow.RestUndertowHttpBinding;
|
||||||
|
import org.apache.camel.component.undertow.UndertowComponent;
|
||||||
|
import org.apache.camel.component.undertow.UndertowEndpoint;
|
||||||
|
import org.apache.camel.spi.RestConfiguration;
|
||||||
|
import org.apache.camel.util.FileUtil;
|
||||||
|
import org.apache.camel.util.HostUtils;
|
||||||
|
import org.apache.camel.util.ObjectHelper;
|
||||||
|
import org.apache.camel.util.URISupport;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author hmlnarik
|
||||||
|
*/
|
||||||
|
public class UndertowKeycloakComponent extends UndertowComponent {
|
||||||
|
|
||||||
|
public UndertowKeycloakComponent() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public UndertowKeycloakComponent(CamelContext context) {
|
||||||
|
super(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected UndertowEndpoint createEndpointInstance(URI endpointUri, UndertowComponent component) throws URISyntaxException {
|
||||||
|
return new UndertowKeycloakEndpoint(endpointUri.toString(), component);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: uncomment line below after backport of https://issues.apache.org/jira/browse/CAMEL-12514 into fuse
|
||||||
|
// @Override
|
||||||
|
protected String getComponentName() {
|
||||||
|
return "undertow-keycloak";
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: remove all below this line after backport of https://issues.apache.org/jira/browse/CAMEL-12514 into fuse
|
||||||
|
@Override
|
||||||
|
public Consumer createConsumer(CamelContext camelContext, Processor processor, String verb, String basePath, String uriTemplate,
|
||||||
|
String consumes, String produces, RestConfiguration configuration, Map<String, Object> parameters) throws Exception {
|
||||||
|
return doCreateConsumer(camelContext, processor, verb, basePath, uriTemplate, consumes, produces, configuration, parameters, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Consumer createApiConsumer(CamelContext camelContext, Processor processor, String contextPath,
|
||||||
|
RestConfiguration configuration, Map<String, Object> parameters) throws Exception {
|
||||||
|
// reuse the createConsumer method we already have. The api need to use GET and match on uri prefix
|
||||||
|
return doCreateConsumer(camelContext, processor, "GET", contextPath, null, null, null, configuration, parameters, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
Consumer doCreateConsumer(CamelContext camelContext, Processor processor, String verb, String basePath, String uriTemplate,
|
||||||
|
String consumes, String produces, RestConfiguration configuration, Map<String, Object> parameters, boolean api) throws Exception {
|
||||||
|
String path = basePath;
|
||||||
|
if (uriTemplate != null) {
|
||||||
|
// make sure to avoid double slashes
|
||||||
|
if (uriTemplate.startsWith("/")) {
|
||||||
|
path = path + uriTemplate;
|
||||||
|
} else {
|
||||||
|
path = path + "/" + uriTemplate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
path = FileUtil.stripLeadingSeparator(path);
|
||||||
|
String scheme = "http";
|
||||||
|
String host = "";
|
||||||
|
int port = 0;
|
||||||
|
|
||||||
|
RestConfiguration config = configuration;
|
||||||
|
if (config == null) {
|
||||||
|
config = camelContext.getRestConfiguration(getComponentName(), true);
|
||||||
|
}
|
||||||
|
if (config.getScheme() != null) {
|
||||||
|
scheme = config.getScheme();
|
||||||
|
}
|
||||||
|
if (config.getHost() != null) {
|
||||||
|
host = config.getHost();
|
||||||
|
}
|
||||||
|
int num = config.getPort();
|
||||||
|
if (num > 0) {
|
||||||
|
port = num;
|
||||||
|
}
|
||||||
|
|
||||||
|
// prefix path with context-path if configured in rest-dsl configuration
|
||||||
|
String contextPath = config.getContextPath();
|
||||||
|
if (ObjectHelper.isNotEmpty(contextPath)) {
|
||||||
|
contextPath = FileUtil.stripTrailingSeparator(contextPath);
|
||||||
|
contextPath = FileUtil.stripLeadingSeparator(contextPath);
|
||||||
|
if (ObjectHelper.isNotEmpty(contextPath)) {
|
||||||
|
path = contextPath + "/" + path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if no explicit hostname set then resolve the hostname
|
||||||
|
if (ObjectHelper.isEmpty(host)) {
|
||||||
|
if (config.getRestHostNameResolver() == RestConfiguration.RestHostNameResolver.allLocalIp) {
|
||||||
|
host = "0.0.0.0";
|
||||||
|
} else if (config.getRestHostNameResolver() == RestConfiguration.RestHostNameResolver.localHostName) {
|
||||||
|
host = HostUtils.getLocalHostName();
|
||||||
|
} else if (config.getRestHostNameResolver() == RestConfiguration.RestHostNameResolver.localIp) {
|
||||||
|
host = HostUtils.getLocalIp();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, Object> map = new HashMap<String, Object>();
|
||||||
|
// build query string, and append any endpoint configuration properties
|
||||||
|
if (config.getComponent() == null || config.getComponent().equals(getComponentName())) {
|
||||||
|
// setup endpoint options
|
||||||
|
if (config.getEndpointProperties() != null && !config.getEndpointProperties().isEmpty()) {
|
||||||
|
map.putAll(config.getEndpointProperties());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean explicitOptions = true;
|
||||||
|
// must use upper case for restrict
|
||||||
|
String restrict = verb.toUpperCase(Locale.US);
|
||||||
|
// allow OPTIONS in rest-dsl to allow clients to call the API and have responses with ALLOW headers
|
||||||
|
if (!restrict.contains("OPTIONS")) {
|
||||||
|
restrict += ",OPTIONS";
|
||||||
|
// this is not an explicit OPTIONS path in the rest-dsl
|
||||||
|
explicitOptions = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean cors = config.isEnableCORS();
|
||||||
|
if (cors) {
|
||||||
|
// allow HTTP Options as we want to handle CORS in rest-dsl
|
||||||
|
map.put("optionsEnabled", "true");
|
||||||
|
} else if (explicitOptions) {
|
||||||
|
// the rest-dsl is using OPTIONS
|
||||||
|
map.put("optionsEnabled", "true");
|
||||||
|
}
|
||||||
|
|
||||||
|
String query = URISupport.createQueryString(map);
|
||||||
|
|
||||||
|
String url;
|
||||||
|
if (api) {
|
||||||
|
url = getComponentName() + ":%s://%s:%s/%s?matchOnUriPrefix=true&httpMethodRestrict=%s";
|
||||||
|
} else {
|
||||||
|
url = getComponentName() + ":%s://%s:%s/%s?matchOnUriPrefix=false&httpMethodRestrict=%s";
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the endpoint
|
||||||
|
url = String.format(url, scheme, host, port, path, restrict);
|
||||||
|
|
||||||
|
if (!query.isEmpty()) {
|
||||||
|
url = url + "&" + query;
|
||||||
|
}
|
||||||
|
|
||||||
|
UndertowEndpoint endpoint = camelContext.getEndpoint(url, UndertowEndpoint.class);
|
||||||
|
setProperties(camelContext, endpoint, parameters);
|
||||||
|
|
||||||
|
if (!map.containsKey("undertowHttpBinding")) {
|
||||||
|
// use the rest binding, if not using a custom http binding
|
||||||
|
endpoint.setUndertowHttpBinding(new RestUndertowHttpBinding());
|
||||||
|
}
|
||||||
|
|
||||||
|
// configure consumer properties
|
||||||
|
Consumer consumer = endpoint.createConsumer(processor);
|
||||||
|
if (config.getConsumerProperties() != null && !config.getConsumerProperties().isEmpty()) {
|
||||||
|
setProperties(camelContext, consumer, config.getConsumerProperties());
|
||||||
|
}
|
||||||
|
|
||||||
|
return consumer;
|
||||||
|
}
|
||||||
|
}
|
||||||
+219
@@ -0,0 +1,219 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 Red Hat, Inc. and/or its affiliates
|
||||||
|
* and other contributors as indicated by the @author tags.
|
||||||
|
*
|
||||||
|
* 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.adapters.camel.undertow;
|
||||||
|
|
||||||
|
import org.keycloak.KeycloakPrincipal;
|
||||||
|
import org.keycloak.adapters.AdapterDeploymentContext;
|
||||||
|
import org.keycloak.adapters.AdapterTokenStore;
|
||||||
|
import org.keycloak.adapters.AuthenticatedActionsHandler;
|
||||||
|
import org.keycloak.adapters.KeycloakDeployment;
|
||||||
|
import org.keycloak.adapters.NodesRegistrationManagement;
|
||||||
|
import org.keycloak.adapters.PreAuthActionsHandler;
|
||||||
|
import org.keycloak.adapters.RequestAuthenticator;
|
||||||
|
import org.keycloak.adapters.spi.AuthChallenge;
|
||||||
|
import org.keycloak.adapters.spi.AuthOutcome;
|
||||||
|
import org.keycloak.adapters.spi.HttpFacade;
|
||||||
|
import org.keycloak.adapters.spi.InMemorySessionIdMapper;
|
||||||
|
import org.keycloak.adapters.spi.SessionIdMapper;
|
||||||
|
import org.keycloak.adapters.undertow.KeycloakUndertowAccount;
|
||||||
|
import org.keycloak.adapters.undertow.OIDCUndertowHttpFacade;
|
||||||
|
import org.keycloak.adapters.undertow.SessionManagementBridge;
|
||||||
|
import org.keycloak.adapters.undertow.UndertowCookieTokenStore;
|
||||||
|
import org.keycloak.adapters.undertow.UndertowRequestAuthenticator;
|
||||||
|
import org.keycloak.adapters.undertow.UndertowSessionTokenStore;
|
||||||
|
import org.keycloak.adapters.undertow.UndertowUserSessionManagement;
|
||||||
|
import org.keycloak.enums.TokenStore;
|
||||||
|
import io.undertow.security.api.SecurityContext;
|
||||||
|
import io.undertow.security.idm.Account;
|
||||||
|
import io.undertow.security.idm.Credential;
|
||||||
|
import io.undertow.security.idm.IdentityManager;
|
||||||
|
import io.undertow.security.impl.SecurityContextImpl;
|
||||||
|
import io.undertow.server.HttpServerExchange;
|
||||||
|
import io.undertow.server.session.InMemorySessionManager;
|
||||||
|
import io.undertow.server.session.SessionManager;
|
||||||
|
import io.undertow.util.AttachmentKey;
|
||||||
|
import io.undertow.util.StatusCodes;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import org.apache.camel.Processor;
|
||||||
|
import org.apache.camel.component.undertow.UndertowConsumer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author hmlnarik
|
||||||
|
*/
|
||||||
|
public class UndertowKeycloakConsumer extends UndertowConsumer {
|
||||||
|
|
||||||
|
private static final Logger LOG = Logger.getLogger(UndertowKeycloakConsumer.class.getName());
|
||||||
|
|
||||||
|
public static final AttachmentKey<KeycloakPrincipal> KEYCLOAK_PRINCIPAL_KEY = AttachmentKey.create(KeycloakPrincipal.class);
|
||||||
|
|
||||||
|
private static final IdentityManager IDENTITY_MANAGER = new IdentityManager() {
|
||||||
|
@Override
|
||||||
|
public Account verify(Account account) {
|
||||||
|
return account;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Account verify(String id, Credential credential) {
|
||||||
|
throw new IllegalStateException("Should never be called in Keycloak flow");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Account verify(Credential credential) {
|
||||||
|
throw new IllegalStateException("Should never be called in Keycloak flow");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
protected SessionIdMapper idMapper = new InMemorySessionIdMapper();
|
||||||
|
|
||||||
|
protected final NodesRegistrationManagement nodesRegistrationManagement = new NodesRegistrationManagement();
|
||||||
|
|
||||||
|
private final UndertowUserSessionManagement userSessionManagement = new UndertowUserSessionManagement();
|
||||||
|
|
||||||
|
protected final AdapterDeploymentContext deploymentContext;
|
||||||
|
|
||||||
|
protected final SessionManager sessionManager;
|
||||||
|
|
||||||
|
protected final List<String> allowedRoles;
|
||||||
|
|
||||||
|
private final int confidentialPort;
|
||||||
|
|
||||||
|
private final Pattern skipPattern;
|
||||||
|
|
||||||
|
public UndertowKeycloakConsumer(UndertowKeycloakEndpoint endpoint, Processor processor,
|
||||||
|
AdapterDeploymentContext deploymentContext, Pattern skipPattern, List<String> allowedRoles, int confidentialPort) {
|
||||||
|
super(endpoint, processor);
|
||||||
|
this.sessionManager = new InMemorySessionManager(endpoint.getEndpointUri());
|
||||||
|
this.deploymentContext = deploymentContext;
|
||||||
|
this.skipPattern = skipPattern;
|
||||||
|
this.confidentialPort = confidentialPort;
|
||||||
|
this.allowedRoles = allowedRoles == null ? Collections.<String>emptyList() : allowedRoles;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getConfidentialPort() {
|
||||||
|
return confidentialPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleRequest(HttpServerExchange httpExchange) throws Exception {
|
||||||
|
if (shouldSkip(httpExchange.getRequestPath())) {
|
||||||
|
super.handleRequest(httpExchange);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//perform only non-blocking operation on exchange
|
||||||
|
if (httpExchange.isInIoThread()) {
|
||||||
|
httpExchange.dispatch(this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OIDCUndertowHttpFacade facade = new OIDCUndertowHttpFacade(httpExchange);
|
||||||
|
KeycloakDeployment deployment = deploymentContext.resolveDeployment(facade);
|
||||||
|
|
||||||
|
if (deployment == null || !deployment.isConfigured()) {
|
||||||
|
httpExchange.setStatusCode(StatusCodes.FORBIDDEN);
|
||||||
|
LOG.fine("deployment not configured");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG.fine("executing PreAuthActionsHandler");
|
||||||
|
SessionManagementBridge bridge = new SessionManagementBridge(userSessionManagement, sessionManager);
|
||||||
|
PreAuthActionsHandler preAuth = new PreAuthActionsHandler(bridge, deploymentContext, facade);
|
||||||
|
if (preAuth.handleRequest()) return;
|
||||||
|
|
||||||
|
SecurityContext securityContext = httpExchange.getSecurityContext();
|
||||||
|
if (securityContext == null) {
|
||||||
|
securityContext = new SecurityContextImpl(httpExchange, IDENTITY_MANAGER);
|
||||||
|
}
|
||||||
|
AdapterTokenStore tokenStore = getTokenStore(httpExchange, facade, deployment, securityContext);
|
||||||
|
tokenStore.checkCurrentToken();
|
||||||
|
|
||||||
|
LOG.fine("executing AuthenticatedActionsHandler");
|
||||||
|
RequestAuthenticator authenticator = new UndertowRequestAuthenticator(facade, deployment, confidentialPort, securityContext, httpExchange, tokenStore);
|
||||||
|
AuthOutcome outcome = authenticator.authenticate();
|
||||||
|
|
||||||
|
if (outcome == AuthOutcome.AUTHENTICATED) {
|
||||||
|
LOG.fine("AUTHENTICATED");
|
||||||
|
if (httpExchange.isResponseComplete()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
AuthenticatedActionsHandler actions = new AuthenticatedActionsHandler(deployment, facade);
|
||||||
|
if (actions.handledRequest()) {
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
final Account authenticatedAccount = securityContext.getAuthenticatedAccount();
|
||||||
|
if (authenticatedAccount instanceof KeycloakUndertowAccount) {
|
||||||
|
final KeycloakUndertowAccount kua = (KeycloakUndertowAccount) authenticatedAccount;
|
||||||
|
httpExchange.putAttachment(KEYCLOAK_PRINCIPAL_KEY, (KeycloakPrincipal) kua.getPrincipal());
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<String> roles = Optional
|
||||||
|
.ofNullable(authenticatedAccount.getRoles())
|
||||||
|
.orElse((Set<String>) Collections.EMPTY_SET);
|
||||||
|
|
||||||
|
LOG.log(Level.FINE, "Allowed roles: {0}, current roles: {1}", new Object[] {allowedRoles, roles});
|
||||||
|
|
||||||
|
if (isRoleAllowed(roles, httpExchange)) {
|
||||||
|
super.handleRequest(httpExchange);
|
||||||
|
} else {
|
||||||
|
httpExchange.setStatusCode(StatusCodes.FORBIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AuthChallenge challenge = authenticator.getChallenge();
|
||||||
|
if (challenge != null) {
|
||||||
|
LOG.fine("challenge");
|
||||||
|
challenge.challenge(facade);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
httpExchange.setStatusCode(StatusCodes.FORBIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isRoleAllowed(Set<String> roles, HttpServerExchange httpExchange) throws Exception {
|
||||||
|
for (String role : allowedRoles) {
|
||||||
|
if (roles.contains(role)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected AdapterTokenStore getTokenStore(HttpServerExchange exchange, HttpFacade facade, KeycloakDeployment deployment, SecurityContext securityContext) {
|
||||||
|
if (deployment.getTokenStore() == TokenStore.SESSION) {
|
||||||
|
return new UndertowSessionTokenStore(exchange, deployment, userSessionManagement, securityContext);
|
||||||
|
} else {
|
||||||
|
return new UndertowCookieTokenStore(facade, deployment, securityContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean shouldSkip(String requestPath) {
|
||||||
|
return skipPattern != null && skipPattern.matcher(requestPath).matches();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+152
@@ -0,0 +1,152 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 Red Hat, Inc. and/or its affiliates
|
||||||
|
* and other contributors as indicated by the @author tags.
|
||||||
|
*
|
||||||
|
* 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.adapters.camel.undertow;
|
||||||
|
|
||||||
|
import org.keycloak.KeycloakPrincipal;
|
||||||
|
import org.keycloak.adapters.AdapterDeploymentContext;
|
||||||
|
import org.keycloak.adapters.KeycloakConfigResolver;
|
||||||
|
import org.keycloak.adapters.KeycloakDeployment;
|
||||||
|
import org.keycloak.adapters.KeycloakDeploymentBuilder;
|
||||||
|
import org.keycloak.representations.adapters.config.AdapterConfig;
|
||||||
|
import io.undertow.server.HttpServerExchange;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import org.apache.camel.Consumer;
|
||||||
|
import org.apache.camel.Exchange;
|
||||||
|
import org.apache.camel.Processor;
|
||||||
|
import org.apache.camel.component.undertow.UndertowComponent;
|
||||||
|
import org.apache.camel.component.undertow.UndertowEndpoint;
|
||||||
|
import static org.keycloak.adapters.camel.undertow.UndertowKeycloakConsumer.KEYCLOAK_PRINCIPAL_KEY;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author hmlnarik
|
||||||
|
*/
|
||||||
|
public class UndertowKeycloakEndpoint extends UndertowEndpoint {
|
||||||
|
|
||||||
|
private static final Logger LOG = Logger.getLogger(UndertowKeycloakEndpoint.class.getName());
|
||||||
|
|
||||||
|
private KeycloakConfigResolver configResolver;
|
||||||
|
|
||||||
|
private AdapterConfig adapterConfig;
|
||||||
|
|
||||||
|
private String skipPattern;
|
||||||
|
|
||||||
|
private List<String> allowedRoles = Collections.emptyList();
|
||||||
|
|
||||||
|
private int confidentialPort = 8443;
|
||||||
|
|
||||||
|
public UndertowKeycloakEndpoint(String uri, UndertowComponent component) {
|
||||||
|
super(uri, component);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdapterConfig getAdapterConfig() {
|
||||||
|
return adapterConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAdapterConfig(AdapterConfig adapterConfig) {
|
||||||
|
LOG.info("adapterConfig");
|
||||||
|
this.adapterConfig = adapterConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSkipPattern() {
|
||||||
|
return skipPattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSkipPattern(String skipPattern) {
|
||||||
|
this.skipPattern = skipPattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getAllowedRoles() {
|
||||||
|
return allowedRoles;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAllowedRoles(List<String> allowedRoles) {
|
||||||
|
this.allowedRoles = allowedRoles;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAllowedRoles(String allowedRoles) {
|
||||||
|
this.allowedRoles = allowedRoles == null ? null : Arrays.asList(allowedRoles.split("\\s*,\\s*"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getConfidentialPort() {
|
||||||
|
return confidentialPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConfidentialPort(int confidentialPort) {
|
||||||
|
this.confidentialPort = confidentialPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeycloakConfigResolver getConfigResolver() {
|
||||||
|
return configResolver;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConfigResolver(KeycloakConfigResolver configResolver) {
|
||||||
|
this.configResolver = configResolver;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Consumer createConsumer(Processor processor) throws Exception {
|
||||||
|
return new UndertowKeycloakConsumer(this, processor, getDeploymentContext(), getSkipPatternAsPattern(), computeAllowedRoles(), this.confidentialPort);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> computeAllowedRoles() {
|
||||||
|
List<String> res = this.allowedRoles == null ? Collections.<String>emptyList() : this.allowedRoles;
|
||||||
|
if (res.isEmpty()) {
|
||||||
|
LOG.warning("No roles were configured, Keycloak will deny every request");
|
||||||
|
}
|
||||||
|
LOG.log(Level.FINE, "Allowed roles: {0}", res);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Exchange createExchange(HttpServerExchange httpExchange) throws Exception {
|
||||||
|
final Exchange res = super.createExchange(httpExchange);
|
||||||
|
|
||||||
|
KeycloakPrincipal principal = httpExchange.getAttachment(KEYCLOAK_PRINCIPAL_KEY);
|
||||||
|
LOG.log(Level.FINE, "principal: {0}", principal);
|
||||||
|
if (principal != null) {
|
||||||
|
res.setProperty(KeycloakPrincipal.class.getName(), principal);
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
private AdapterDeploymentContext getDeploymentContext() {
|
||||||
|
if (configResolver != null) {
|
||||||
|
LOG.log(Level.INFO, "Using {0} to resolve Keycloak configuration on a per-request basis.", configResolver.getClass());
|
||||||
|
return new AdapterDeploymentContext(configResolver);
|
||||||
|
} else if (adapterConfig != null) {
|
||||||
|
KeycloakDeployment kd = KeycloakDeploymentBuilder.build(adapterConfig);
|
||||||
|
return new AdapterDeploymentContext(kd);
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG.warning("Adapter is unconfigured, Keycloak will deny every request");
|
||||||
|
return new AdapterDeploymentContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Pattern getSkipPatternAsPattern() {
|
||||||
|
return skipPattern == null
|
||||||
|
? null
|
||||||
|
: Pattern.compile(skipPattern, Pattern.DOTALL);
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
class=org.keycloak.adapters.camel.undertow.UndertowKeycloakComponent
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
||||||
|
~ and other contributors as indicated by the @author tags.
|
||||||
|
~
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<parent>
|
||||||
|
<artifactId>keycloak-fuse7-integration-pom</artifactId>
|
||||||
|
<groupId>org.keycloak</groupId>
|
||||||
|
<version>4.0.0.Beta3</version>
|
||||||
|
<relativePath>../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>keycloak-pax-web-jetty94</artifactId>
|
||||||
|
<name>Keycloak Fuse 7.0 Adapter - Jetty 9.4</name>
|
||||||
|
<packaging>bundle</packaging>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<keycloak.osgi.export>
|
||||||
|
org.keycloak.adapters.osgi.jetty94.*;version="${project.version}"
|
||||||
|
</keycloak.osgi.export>
|
||||||
|
<keycloak.osgi.import>
|
||||||
|
!org.keycloak.adapters.osgi.jetty94,
|
||||||
|
org.keycloak.*;version="${project.version}",
|
||||||
|
*;resolution:=optional
|
||||||
|
</keycloak.osgi.import>
|
||||||
|
<keycloak.osgi.fragment>org.ops4j.pax.web.pax-web-jetty</keycloak.osgi.fragment>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jboss.logging</groupId>
|
||||||
|
<artifactId>jboss-logging</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.ops4j.pax.web</groupId>
|
||||||
|
<artifactId>pax-web-api</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.ops4j.pax.web</groupId>
|
||||||
|
<artifactId>pax-web-spi</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.osgi</groupId>
|
||||||
|
<artifactId>org.osgi.core</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.osgi</groupId>
|
||||||
|
<artifactId>org.osgi.enterprise</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.keycloak</groupId>
|
||||||
|
<artifactId>keycloak-jetty94-adapter</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-security</artifactId>
|
||||||
|
<version>${jetty9.version}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>${maven.compiler.source}</source>
|
||||||
|
<target>${maven.compiler.target}</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Adding OSGI metadata to the JAR without changing the packaging type. -->
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<archive>
|
||||||
|
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
|
||||||
|
</archive>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.felix</groupId>
|
||||||
|
<artifactId>maven-bundle-plugin</artifactId>
|
||||||
|
<extensions>true</extensions>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>bundle-manifest</id>
|
||||||
|
<phase>process-classes</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>manifest</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<instructions>
|
||||||
|
<Bundle-Name>${project.name}</Bundle-Name>
|
||||||
|
<Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
|
||||||
|
<Import-Package>${keycloak.osgi.import}</Import-Package>
|
||||||
|
<Export-Package>${keycloak.osgi.export}</Export-Package>
|
||||||
|
<Fragment-Host>${keycloak.osgi.fragment}</Fragment-Host>
|
||||||
|
</instructions>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 Red Hat, Inc. and/or its affiliates
|
||||||
|
* and other contributors as indicated by the @author tags.
|
||||||
|
*
|
||||||
|
* 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.adapters.osgi.jetty94;
|
||||||
|
|
||||||
|
import org.ops4j.pax.web.service.AuthenticatorService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author hmlnarik
|
||||||
|
*/
|
||||||
|
public class KeycloakAuthenticatorService implements AuthenticatorService {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T getAuthenticatorService(String method, Class<T> iface) {
|
||||||
|
if (method == null || iface != org.eclipse.jetty.security.Authenticator.class) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("KEYCLOAK".equalsIgnoreCase(method)) {
|
||||||
|
return iface.cast(new org.keycloak.adapters.jetty.KeycloakJettyAuthenticator());
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+275
@@ -0,0 +1,275 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
||||||
|
* and other contributors as indicated by the @author tags.
|
||||||
|
*
|
||||||
|
* 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.adapters.osgi.jetty94;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.security.ConstraintMapping;
|
||||||
|
import org.eclipse.jetty.util.security.Constraint;
|
||||||
|
import org.jboss.logging.Logger;
|
||||||
|
import org.ops4j.pax.web.service.WebContainer;
|
||||||
|
import org.ops4j.pax.web.service.spi.model.SecurityConstraintMappingModel;
|
||||||
|
import org.osgi.framework.BundleContext;
|
||||||
|
import org.osgi.framework.ServiceReference;
|
||||||
|
import org.osgi.service.http.HttpContext;
|
||||||
|
import org.osgi.util.tracker.ServiceTracker;
|
||||||
|
import org.osgi.util.tracker.ServiceTrackerCustomizer;
|
||||||
|
|
||||||
|
import java.net.URL;
|
||||||
|
import java.security.SecureRandom;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integration with pax-web, which allows to inject custom jetty-web.xml configuration from current bundle classpath into {@link WebContainer}
|
||||||
|
* and allows to inject custom security constraint for securing resources by Keycloak.
|
||||||
|
*
|
||||||
|
* <p>It assumes that pax-web {@link WebContainer} is used as implementation of OSGI {@link org.osgi.service.http.HttpService}, which
|
||||||
|
* is true in karaf/fuse environment</p>
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
|
||||||
|
*/
|
||||||
|
public class PaxWebIntegrationService {
|
||||||
|
|
||||||
|
protected static final Logger log = Logger.getLogger(PaxWebIntegrationService.class);
|
||||||
|
|
||||||
|
private BundleContext bundleContext;
|
||||||
|
private String jettyWebXmlLocation;
|
||||||
|
private List<Object> constraintMappings;
|
||||||
|
|
||||||
|
private ServiceTracker webContainerTracker;
|
||||||
|
private HttpContext httpContext;
|
||||||
|
|
||||||
|
public BundleContext getBundleContext() {
|
||||||
|
return bundleContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBundleContext(BundleContext bundleContext) {
|
||||||
|
this.bundleContext = bundleContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getJettyWebXmlLocation() {
|
||||||
|
return jettyWebXmlLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setJettyWebXmlLocation(String jettyWebXmlLocation) {
|
||||||
|
this.jettyWebXmlLocation = jettyWebXmlLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Object> getConstraintMappings() {
|
||||||
|
return constraintMappings;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConstraintMappings(List<Object> constraintMappings) {
|
||||||
|
this.constraintMappings = constraintMappings;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ServiceTracker getWebContainerTracker() {
|
||||||
|
return webContainerTracker;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected HttpContext getHttpContext() {
|
||||||
|
return httpContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void start() {
|
||||||
|
ServiceTrackerCustomizer trackerCustomizer = new ServiceTrackerCustomizer() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object addingService(ServiceReference reference) {
|
||||||
|
return addingWebContainerCallback(reference);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void modifiedService(ServiceReference reference, Object service) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removedService(ServiceReference reference, Object service) {
|
||||||
|
removingWebContainerCallback(reference);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
webContainerTracker = new ServiceTracker(bundleContext, WebContainer.class.getName(), trackerCustomizer);
|
||||||
|
webContainerTracker.open();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop() {
|
||||||
|
webContainerTracker.remove(webContainerTracker.getServiceReference());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected WebContainer addingWebContainerCallback(ServiceReference webContainerServiceReference) {
|
||||||
|
WebContainer service = (WebContainer) bundleContext.getService(webContainerServiceReference);
|
||||||
|
httpContext = service.createDefaultHttpContext();
|
||||||
|
|
||||||
|
addJettyWebXml(service);
|
||||||
|
|
||||||
|
if (constraintMappings == null) {
|
||||||
|
throw new IllegalStateException("constraintMappings was null!");
|
||||||
|
}
|
||||||
|
List<ConstraintHandler> handlers = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
handlers.add(new JettyConstraintHandler());
|
||||||
|
} catch (Throwable t) {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
handlers.add(new PaxWebConstraintHandler());
|
||||||
|
} catch (Throwable t) {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
|
for (Object constraintMapping : constraintMappings) {
|
||||||
|
boolean handled = false;
|
||||||
|
for (ConstraintHandler handler : handlers) {
|
||||||
|
handled |= handler.addConstraintMapping(httpContext, service, constraintMapping);
|
||||||
|
}
|
||||||
|
if (!handled) {
|
||||||
|
log.warnv("Unable to add constraint mapping for constraint of type " + constraintMapping.getClass().toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
service.registerLoginConfig("BASIC", "does-not-matter", null, null, httpContext);
|
||||||
|
|
||||||
|
return service;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void addJettyWebXml(WebContainer service) {
|
||||||
|
String jettyWebXmlLoc;
|
||||||
|
if (this.jettyWebXmlLocation == null) {
|
||||||
|
jettyWebXmlLoc = "/WEB-INF/jetty-web.xml";
|
||||||
|
} else {
|
||||||
|
jettyWebXmlLoc = this.jettyWebXmlLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
URL jettyWebXml = bundleContext.getBundle().getResource(jettyWebXmlLoc);
|
||||||
|
if (jettyWebXml != null) {
|
||||||
|
log.debug("Found jetty-web XML configuration on bundle classpath on " + jettyWebXmlLoc);
|
||||||
|
service.registerJettyWebXml(jettyWebXml, httpContext);
|
||||||
|
} else {
|
||||||
|
log.debug("Not found jetty-web XML configuration on bundle classpath on " + jettyWebXmlLoc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void addConstraintMapping(WebContainer service, SecurityConstraintMappingModel constraintMapping) {
|
||||||
|
String name = constraintMapping.getConstraintName();
|
||||||
|
if (name == null) {
|
||||||
|
name = "Constraint-" + new SecureRandom().nextInt(Integer.MAX_VALUE);
|
||||||
|
}
|
||||||
|
log.debug("Adding security constraint name=" + name + ", url=" + constraintMapping.getUrl() + ", dataConstraint=" + constraintMapping.getDataConstraint() + ", canAuthenticate="
|
||||||
|
+ constraintMapping.isAuthentication() + ", roles=" + constraintMapping.getRoles());
|
||||||
|
service.registerConstraintMapping(name, constraintMapping.getUrl(), constraintMapping.getMapping(), constraintMapping.getDataConstraint(), constraintMapping.isAuthentication(), constraintMapping.getRoles(), httpContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void addConstraintMapping(WebContainer service, ConstraintMapping constraintMapping) {
|
||||||
|
Constraint constraint = constraintMapping.getConstraint();
|
||||||
|
String[] roles = constraint.getRoles();
|
||||||
|
// name property is unavailable on constraint object :/
|
||||||
|
|
||||||
|
String name = "Constraint-" + new SecureRandom().nextInt(Integer.MAX_VALUE);
|
||||||
|
|
||||||
|
int dataConstraint = constraint.getDataConstraint();
|
||||||
|
String dataConstraintStr;
|
||||||
|
switch (dataConstraint) {
|
||||||
|
case Constraint.DC_UNSET: dataConstraintStr = null; break;
|
||||||
|
case Constraint.DC_NONE: dataConstraintStr = "NONE"; break;
|
||||||
|
case Constraint.DC_CONFIDENTIAL: dataConstraintStr = "CONFIDENTIAL"; break;
|
||||||
|
case Constraint.DC_INTEGRAL: dataConstraintStr = "INTEGRAL"; break;
|
||||||
|
default:
|
||||||
|
log.warnv("Unknown data constraint: " + dataConstraint);
|
||||||
|
dataConstraintStr = "CONFIDENTIAL";
|
||||||
|
}
|
||||||
|
List<String> rolesList = Arrays.asList(roles);
|
||||||
|
|
||||||
|
log.debug("Adding security constraint name=" + name + ", url=" + constraintMapping.getPathSpec() + ", dataConstraint=" + dataConstraintStr + ", canAuthenticate="
|
||||||
|
+ constraint.getAuthenticate() + ", roles=" + rolesList);
|
||||||
|
service.registerConstraintMapping(name, constraintMapping.getPathSpec(), null, dataConstraintStr, constraint.getAuthenticate(), rolesList, httpContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void removingWebContainerCallback(ServiceReference serviceReference) {
|
||||||
|
WebContainer service = (WebContainer)bundleContext.getService(serviceReference);
|
||||||
|
if (service != null) {
|
||||||
|
service.unregisterLoginConfig(httpContext);
|
||||||
|
service.unregisterConstraintMapping(httpContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private interface ConstraintHandler {
|
||||||
|
boolean addConstraintMapping(HttpContext httpContext, WebContainer service, Object cm);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class PaxWebConstraintHandler implements ConstraintHandler {
|
||||||
|
|
||||||
|
public boolean addConstraintMapping(HttpContext httpContext, WebContainer service, Object cm) {
|
||||||
|
if (cm instanceof SecurityConstraintMappingModel) {
|
||||||
|
SecurityConstraintMappingModel constraintMapping = (SecurityConstraintMappingModel) cm;
|
||||||
|
String name = constraintMapping.getConstraintName();
|
||||||
|
if (name == null) {
|
||||||
|
name = "Constraint-" + new SecureRandom().nextInt(Integer.MAX_VALUE);
|
||||||
|
}
|
||||||
|
log.debug("Adding security constraint name=" + name + ", url=" + constraintMapping.getUrl() + ", dataConstraint=" + constraintMapping.getDataConstraint() + ", canAuthenticate="
|
||||||
|
+ constraintMapping.isAuthentication() + ", roles=" + constraintMapping.getRoles());
|
||||||
|
service.registerConstraintMapping(name, constraintMapping.getUrl(), constraintMapping.getMapping(), constraintMapping.getDataConstraint(), constraintMapping.isAuthentication(), constraintMapping.getRoles(), httpContext);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class JettyConstraintHandler implements ConstraintHandler {
|
||||||
|
|
||||||
|
public boolean addConstraintMapping(HttpContext httpContext, WebContainer service, Object cm) {
|
||||||
|
if (cm instanceof ConstraintMapping) {
|
||||||
|
ConstraintMapping constraintMapping = (ConstraintMapping) cm;
|
||||||
|
Constraint constraint = constraintMapping.getConstraint();
|
||||||
|
String[] roles = constraint.getRoles();
|
||||||
|
// name property is unavailable on constraint object :/
|
||||||
|
|
||||||
|
String name = "Constraint-" + new SecureRandom().nextInt(Integer.MAX_VALUE);
|
||||||
|
|
||||||
|
int dataConstraint = constraint.getDataConstraint();
|
||||||
|
String dataConstraintStr;
|
||||||
|
switch (dataConstraint) {
|
||||||
|
case Constraint.DC_UNSET:
|
||||||
|
dataConstraintStr = null;
|
||||||
|
break;
|
||||||
|
case Constraint.DC_NONE:
|
||||||
|
dataConstraintStr = "NONE";
|
||||||
|
break;
|
||||||
|
case Constraint.DC_CONFIDENTIAL:
|
||||||
|
dataConstraintStr = "CONFIDENTIAL";
|
||||||
|
break;
|
||||||
|
case Constraint.DC_INTEGRAL:
|
||||||
|
dataConstraintStr = "INTEGRAL";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
log.warnv("Unknown data constraint: " + dataConstraint);
|
||||||
|
dataConstraintStr = "CONFIDENTIAL";
|
||||||
|
}
|
||||||
|
List<String> rolesList = Arrays.asList(roles);
|
||||||
|
|
||||||
|
log.debug("Adding security constraint name=" + name + ", url=" + constraintMapping.getPathSpec() + ", dataConstraint=" + dataConstraintStr + ", canAuthenticate="
|
||||||
|
+ constraint.getAuthenticate() + ", roles=" + rolesList);
|
||||||
|
service.registerConstraintMapping(name, constraintMapping.getPathSpec(), null, dataConstraintStr, constraint.getAuthenticate(), rolesList, httpContext);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
org.keycloak.adapters.osgi.jetty94.KeycloakAuthenticatorService
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
||||||
|
~ and other contributors as indicated by the @author tags.
|
||||||
|
~
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<parent>
|
||||||
|
<artifactId>keycloak-parent</artifactId>
|
||||||
|
<groupId>org.keycloak</groupId>
|
||||||
|
<version>4.0.0.Beta3</version>
|
||||||
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>keycloak-fuse7-integration-pom</artifactId>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
<name>Keycloak Fuse 7.0 Integration</name>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<fuse7.version>7.0.1-SNAPSHOT</fuse7.version>
|
||||||
|
<tomcat.version>8.0.14</tomcat.version>
|
||||||
|
<jetty9.version>9.4.2.v20170220</jetty9.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<modules>
|
||||||
|
<module>camel-undertow</module>
|
||||||
|
<module>jetty94</module>
|
||||||
|
<module>tomcat8</module>
|
||||||
|
<module>undertow</module>
|
||||||
|
</modules>
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
||||||
|
~ and other contributors as indicated by the @author tags.
|
||||||
|
~
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<parent>
|
||||||
|
<artifactId>keycloak-fuse7-integration-pom</artifactId>
|
||||||
|
<groupId>org.keycloak</groupId>
|
||||||
|
<version>4.0.0.Beta3</version>
|
||||||
|
<relativePath>../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>keycloak-pax-web-tomcat8</artifactId>
|
||||||
|
<name>Keycloak Fuse 7.0 Adapter - Tomcat 8</name>
|
||||||
|
<packaging>bundle</packaging>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<keycloak.osgi.export>
|
||||||
|
org.keycloak.adapters.osgi.tomcat.*;version="${project.version}"
|
||||||
|
</keycloak.osgi.export>
|
||||||
|
<keycloak.osgi.import>
|
||||||
|
!org.keycloak.adapters.osgi.tomcat,
|
||||||
|
org.keycloak.*;version="${project.version}",
|
||||||
|
*;resolution:=optional
|
||||||
|
</keycloak.osgi.import>
|
||||||
|
<keycloak.osgi.fragment>org.ops4j.pax.web.pax-web-tomcat</keycloak.osgi.fragment>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jboss.logging</groupId>
|
||||||
|
<artifactId>jboss-logging</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.ops4j.pax.web</groupId>
|
||||||
|
<artifactId>pax-web-api</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.keycloak</groupId>
|
||||||
|
<artifactId>keycloak-tomcat8-adapter</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tomcat</groupId>
|
||||||
|
<artifactId>tomcat-catalina</artifactId>
|
||||||
|
<version>${tomcat.version}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>${maven.compiler.source}</source>
|
||||||
|
<target>${maven.compiler.target}</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Adding OSGI metadata to the JAR without changing the packaging type. -->
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<archive>
|
||||||
|
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
|
||||||
|
</archive>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.felix</groupId>
|
||||||
|
<artifactId>maven-bundle-plugin</artifactId>
|
||||||
|
<extensions>true</extensions>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>bundle-manifest</id>
|
||||||
|
<phase>process-classes</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>manifest</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<instructions>
|
||||||
|
<Bundle-Name>${project.name}</Bundle-Name>
|
||||||
|
<Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
|
||||||
|
<Import-Package>${keycloak.osgi.import}</Import-Package>
|
||||||
|
<Export-Package>${keycloak.osgi.export}</Export-Package>
|
||||||
|
<Fragment-Host>${keycloak.osgi.fragment}</Fragment-Host>
|
||||||
|
</instructions>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
+19
-8
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
* Copyright 2018 Red Hat, Inc. and/or its affiliates
|
||||||
* and other contributors as indicated by the @author tags.
|
* and other contributors as indicated by the @author tags.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -14,17 +14,28 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.keycloak.testsuite.adapter.example;
|
|
||||||
|
|
||||||
import org.keycloak.testsuite.adapter.example.authorization.AbstractPhotozExampleAdapterTest;
|
package org.keycloak.adapters.osgi.tomcat;
|
||||||
import org.keycloak.testsuite.arquillian.annotation.AppServerContainer;
|
|
||||||
|
import org.ops4j.pax.web.service.AuthenticatorService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author tkyjovsk
|
* @author hmlnarik
|
||||||
*/
|
*/
|
||||||
@AppServerContainer("app-server-wildfly8")
|
public class KeycloakAuthenticatorService implements AuthenticatorService {
|
||||||
//@AdapterLibsLocationProperty("adapter.libs.wildfly")
|
|
||||||
public class Wildfly8PhotozExampleAdapterTest extends AbstractPhotozExampleAdapterTest {
|
@Override
|
||||||
|
public <T> T getAuthenticatorService(String method, Class<T> iface) {
|
||||||
|
if (method == null || iface != org.apache.catalina.Valve.class) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("KEYCLOAK".equalsIgnoreCase(method)) {
|
||||||
|
return iface.cast(new org.keycloak.adapters.tomcat.KeycloakAuthenticatorValve());
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
org.keycloak.adapters.osgi.tomcat.KeycloakAuthenticatorService
|
||||||
@@ -0,0 +1,158 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright 2016 Red Hat, Inc. and/or its affiliates
|
||||||
|
~ and other contributors as indicated by the @author tags.
|
||||||
|
~
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<parent>
|
||||||
|
<artifactId>keycloak-fuse7-integration-pom</artifactId>
|
||||||
|
<groupId>org.keycloak</groupId>
|
||||||
|
<version>4.0.0.Beta3</version>
|
||||||
|
<relativePath>../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<artifactId>keycloak-pax-web-undertow</artifactId>
|
||||||
|
<name>Keycloak Fuse 7.0 Adapter - Undertow</name>
|
||||||
|
<packaging>bundle</packaging>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<keycloak.osgi.export>
|
||||||
|
org.keycloak.adapters.osgi.undertow.*;version="${project.version}"
|
||||||
|
</keycloak.osgi.export>
|
||||||
|
<keycloak.osgi.import>
|
||||||
|
!org.keycloak.adapters.osgi.undertow,
|
||||||
|
org.keycloak.*;version="${project.version}",
|
||||||
|
org.keycloak.adapters.osgi.*;version="${project.version}",
|
||||||
|
org.ops4j.pax.web.*;version="[3.0,8)",
|
||||||
|
javax.servlet.*;version="[2.5,4)";resolution:=optional,
|
||||||
|
org.apache.cxf.transport.http;resolution:=optional;version="[3,4)",
|
||||||
|
org.apache.cxf.transport.http_undertow;resolution:=optional;version="[3,4)",
|
||||||
|
org.apache.cxf.transport.servlet;resolution:=optional;version="[3,4)",
|
||||||
|
io.undertow.*,
|
||||||
|
*;resolution:=optional
|
||||||
|
</keycloak.osgi.import>
|
||||||
|
<keycloak.osgi.fragment>org.ops4j.pax.web.pax-web-undertow</keycloak.osgi.fragment>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jboss.logging</groupId>
|
||||||
|
<artifactId>jboss-logging</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.osgi</groupId>
|
||||||
|
<artifactId>org.osgi.core</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.osgi</groupId>
|
||||||
|
<artifactId>org.osgi.enterprise</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.ops4j.pax.web</groupId>
|
||||||
|
<artifactId>pax-web-runtime</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.ops4j.pax.web</groupId>
|
||||||
|
<artifactId>pax-web-spi</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.ops4j.pax.web</groupId>
|
||||||
|
<artifactId>pax-web-api</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.cxf</groupId>
|
||||||
|
<artifactId>cxf-rt-transports-http</artifactId>
|
||||||
|
<version>${cxf.version}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.cxf</groupId>
|
||||||
|
<artifactId>cxf-rt-transports-http-undertow</artifactId>
|
||||||
|
<version>${cxf.version}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.undertow</groupId>
|
||||||
|
<artifactId>undertow-servlet</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.keycloak</groupId>
|
||||||
|
<artifactId>keycloak-undertow-adapter</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.keycloak</groupId>
|
||||||
|
<artifactId>keycloak-osgi-adapter</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>${maven.compiler.source}</source>
|
||||||
|
<target>${maven.compiler.target}</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Adding OSGI metadata to the JAR without changing the packaging type. -->
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<archive>
|
||||||
|
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
|
||||||
|
</archive>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.felix</groupId>
|
||||||
|
<artifactId>maven-bundle-plugin</artifactId>
|
||||||
|
<extensions>true</extensions>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>bundle-manifest</id>
|
||||||
|
<phase>process-classes</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>manifest</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<instructions>
|
||||||
|
<Bundle-Name>${project.name}</Bundle-Name>
|
||||||
|
<Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
|
||||||
|
<Import-Package>${keycloak.osgi.import}</Import-Package>
|
||||||
|
<Export-Package>${keycloak.osgi.export}</Export-Package>
|
||||||
|
<Fragment-Host>${keycloak.osgi.fragment}</Fragment-Host>
|
||||||
|
</instructions>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
+174
@@ -0,0 +1,174 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 Red Hat, Inc. and/or its affiliates
|
||||||
|
* and other contributors as indicated by the @author tags.
|
||||||
|
*
|
||||||
|
* 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.adapters.osgi.undertow;
|
||||||
|
|
||||||
|
import org.keycloak.adapters.AdapterDeploymentContext;
|
||||||
|
import org.keycloak.adapters.KeycloakConfigResolver;
|
||||||
|
import org.keycloak.adapters.KeycloakDeployment;
|
||||||
|
import org.keycloak.adapters.KeycloakDeploymentBuilder;
|
||||||
|
import org.keycloak.adapters.NodesRegistrationManagement;
|
||||||
|
import org.keycloak.adapters.spi.InMemorySessionIdMapper;
|
||||||
|
import org.keycloak.adapters.spi.SessionIdMapper;
|
||||||
|
import org.keycloak.adapters.undertow.UndertowAuthenticationMechanism;
|
||||||
|
import org.keycloak.adapters.undertow.UndertowUserSessionManagement;
|
||||||
|
import org.keycloak.representations.adapters.config.AdapterConfig;
|
||||||
|
import io.undertow.security.api.AuthenticationMechanism;
|
||||||
|
import io.undertow.security.api.AuthenticationMode;
|
||||||
|
import io.undertow.security.handlers.AuthenticationCallHandler;
|
||||||
|
import io.undertow.security.handlers.AuthenticationConstraintHandler;
|
||||||
|
import io.undertow.security.handlers.AuthenticationMechanismsHandler;
|
||||||
|
import io.undertow.security.handlers.SecurityInitialHandler;
|
||||||
|
import io.undertow.security.idm.Account;
|
||||||
|
import io.undertow.security.idm.Credential;
|
||||||
|
import io.undertow.security.idm.IdentityManager;
|
||||||
|
import io.undertow.server.HttpHandler;
|
||||||
|
import io.undertow.server.HttpServerExchange;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import org.apache.cxf.transport.http_undertow.CXFUndertowHttpHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author hmlnarik
|
||||||
|
*/
|
||||||
|
public class CxfKeycloakAuthHandler implements CXFUndertowHttpHandler {
|
||||||
|
|
||||||
|
private static final Logger LOG = Logger.getLogger(CxfKeycloakAuthHandler.class.getName());
|
||||||
|
|
||||||
|
private static final IdentityManager IDENTITY_MANAGER = new IdentityManager() {
|
||||||
|
@Override
|
||||||
|
public Account verify(Account account) {
|
||||||
|
return account;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Account verify(String id, Credential credential) {
|
||||||
|
throw new IllegalStateException("Should never be called in Keycloak flow");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Account verify(Credential credential) {
|
||||||
|
throw new IllegalStateException("Should never be called in Keycloak flow");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final UndertowUserSessionManagement userSessionManagement = new UndertowUserSessionManagement();
|
||||||
|
|
||||||
|
protected final NodesRegistrationManagement nodesRegistrationManagement = new NodesRegistrationManagement();
|
||||||
|
|
||||||
|
protected final SessionIdMapper idMapper = new InMemorySessionIdMapper();
|
||||||
|
|
||||||
|
private final AtomicReference<HttpHandler> securityHandler = new AtomicReference<>();
|
||||||
|
|
||||||
|
private Pattern skipPattern;
|
||||||
|
|
||||||
|
private int confidentialPort = 8443;
|
||||||
|
|
||||||
|
private HttpHandler next;
|
||||||
|
|
||||||
|
private KeycloakConfigResolver configResolver;
|
||||||
|
|
||||||
|
private AdapterConfig adapterConfig;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleRequest(HttpServerExchange exchange) throws Exception {
|
||||||
|
if (shouldSkip(exchange.getRequestPath())) {
|
||||||
|
next.handleRequest(exchange);
|
||||||
|
} else {
|
||||||
|
getSecurityHandler().handleRequest(exchange);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private HttpHandler getSecurityHandler() {
|
||||||
|
if (this.securityHandler.get() == null) {
|
||||||
|
HttpHandler handler = this.next;
|
||||||
|
|
||||||
|
handler = new AuthenticationCallHandler(handler);
|
||||||
|
handler = new AuthenticationConstraintHandler(handler);
|
||||||
|
|
||||||
|
AdapterDeploymentContext deploymentContext = buildDeploymentContext();
|
||||||
|
|
||||||
|
final List<AuthenticationMechanism> mechanisms
|
||||||
|
= Collections.<AuthenticationMechanism>singletonList(
|
||||||
|
new UndertowAuthenticationMechanism(deploymentContext, userSessionManagement, nodesRegistrationManagement, confidentialPort, null));
|
||||||
|
handler = new AuthenticationMechanismsHandler(handler, mechanisms);
|
||||||
|
|
||||||
|
this.securityHandler.compareAndSet(null, new SecurityInitialHandler(AuthenticationMode.PRO_ACTIVE, IDENTITY_MANAGER, "KEYCLOAK", handler));
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.securityHandler.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
private AdapterDeploymentContext buildDeploymentContext() {
|
||||||
|
if (configResolver != null) {
|
||||||
|
LOG.log(Level.INFO, "Using {0} to resolve Keycloak configuration on a per-request basis.", configResolver.getClass());
|
||||||
|
return new AdapterDeploymentContext(configResolver);
|
||||||
|
} else if (adapterConfig != null) {
|
||||||
|
KeycloakDeployment kd = KeycloakDeploymentBuilder.build(adapterConfig);
|
||||||
|
return new AdapterDeploymentContext(kd);
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG.warning("Adapter is unconfigured, Keycloak will deny every request");
|
||||||
|
return new AdapterDeploymentContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setNext(HttpHandler nextHandler) {
|
||||||
|
this.next = nextHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean shouldSkip(String requestPath) {
|
||||||
|
return skipPattern != null && skipPattern.matcher(requestPath).matches();
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeycloakConfigResolver getConfigResolver() {
|
||||||
|
return configResolver;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConfigResolver(KeycloakConfigResolver configResolver) {
|
||||||
|
this.configResolver = configResolver;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getConfidentialPort() {
|
||||||
|
return confidentialPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConfidentialPort(int confidentialPort) {
|
||||||
|
this.confidentialPort = confidentialPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdapterConfig getAdapterConfig() {
|
||||||
|
return adapterConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAdapterConfig(AdapterConfig adapterConfig) {
|
||||||
|
this.adapterConfig = adapterConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSkipPattern() {
|
||||||
|
return skipPattern.pattern();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSkipPattern(String skipPattern) {
|
||||||
|
this.skipPattern = Pattern.compile(skipPattern, Pattern.DOTALL);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 Red Hat, Inc. and/or its affiliates
|
||||||
|
* and other contributors as indicated by the @author tags.
|
||||||
|
*
|
||||||
|
* 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.adapters.osgi.undertow;
|
||||||
|
|
||||||
|
import org.ops4j.pax.web.service.AuthenticatorService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author hmlnarik
|
||||||
|
*/
|
||||||
|
public class KeycloakAuthenticatorService implements AuthenticatorService {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T> T getAuthenticatorService(String method, Class<T> iface) {
|
||||||
|
if (method == null || iface != io.undertow.servlet.ServletExtension.class) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("KEYCLOAK".equalsIgnoreCase(method)) {
|
||||||
|
return iface.cast(new org.keycloak.adapters.undertow.KeycloakServletExtension());
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+137
@@ -0,0 +1,137 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
||||||
|
* and other contributors as indicated by the @author tags.
|
||||||
|
*
|
||||||
|
* 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.adapters.osgi.undertow;
|
||||||
|
|
||||||
|
import org.keycloak.adapters.osgi.PaxWebSecurityConstraintMapping;
|
||||||
|
import org.jboss.logging.Logger;
|
||||||
|
import org.ops4j.pax.web.service.WebContainer;
|
||||||
|
import org.osgi.framework.BundleContext;
|
||||||
|
import org.osgi.framework.ServiceReference;
|
||||||
|
import org.osgi.service.http.HttpContext;
|
||||||
|
import org.osgi.util.tracker.ServiceTracker;
|
||||||
|
import org.osgi.util.tracker.ServiceTrackerCustomizer;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integration with pax-web, which allows to inject custom security constraint for securing resources by Keycloak.
|
||||||
|
*
|
||||||
|
* <p>It assumes that pax-web {@link WebContainer} is used as implementation of OSGI {@link org.osgi.service.http.HttpService}, which
|
||||||
|
* is true in karaf/fuse environment</p>
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
|
||||||
|
*/
|
||||||
|
public class PaxWebIntegrationService {
|
||||||
|
|
||||||
|
protected static final Logger log = Logger.getLogger(PaxWebIntegrationService.class);
|
||||||
|
|
||||||
|
private BundleContext bundleContext;
|
||||||
|
private List<PaxWebSecurityConstraintMapping> constraintMappings;
|
||||||
|
|
||||||
|
private ServiceTracker webContainerTracker;
|
||||||
|
private HttpContext httpContext;
|
||||||
|
|
||||||
|
public BundleContext getBundleContext() {
|
||||||
|
return bundleContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBundleContext(BundleContext bundleContext) {
|
||||||
|
this.bundleContext = bundleContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<PaxWebSecurityConstraintMapping> getConstraintMappings() {
|
||||||
|
return constraintMappings;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConstraintMappings(List<PaxWebSecurityConstraintMapping> constraintMappings) {
|
||||||
|
this.constraintMappings = constraintMappings;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ServiceTracker getWebContainerTracker() {
|
||||||
|
return webContainerTracker;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected HttpContext getHttpContext() {
|
||||||
|
return httpContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void start() {
|
||||||
|
ServiceTrackerCustomizer trackerCustomizer = new ServiceTrackerCustomizer() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object addingService(ServiceReference reference) {
|
||||||
|
return addingWebContainerCallback(reference);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void modifiedService(ServiceReference reference, Object service) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removedService(ServiceReference reference, Object service) {
|
||||||
|
removingWebContainerCallback(reference);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
webContainerTracker = new ServiceTracker(bundleContext, WebContainer.class.getName(), trackerCustomizer);
|
||||||
|
webContainerTracker.open();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop() {
|
||||||
|
webContainerTracker.remove(webContainerTracker.getServiceReference());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected WebContainer addingWebContainerCallback(ServiceReference webContainerServiceReference) {
|
||||||
|
WebContainer service = (WebContainer) bundleContext.getService(webContainerServiceReference);
|
||||||
|
httpContext = service.createDefaultHttpContext();
|
||||||
|
|
||||||
|
if (constraintMappings == null) {
|
||||||
|
throw new IllegalStateException("constraintMappings was null!");
|
||||||
|
}
|
||||||
|
for (PaxWebSecurityConstraintMapping constraintMapping : constraintMappings) {
|
||||||
|
addConstraintMapping(service, constraintMapping);
|
||||||
|
}
|
||||||
|
|
||||||
|
service.registerLoginConfig("KEYCLOAK", "specified-in-keycloak-json", null, null, httpContext);
|
||||||
|
|
||||||
|
return service;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void addConstraintMapping(WebContainer service, PaxWebSecurityConstraintMapping cm) {
|
||||||
|
log.debug("Adding security constraint name=" + cm.getConstraintName() + ", url=" + cm.getUrl() + ", dataConstraint=" + cm.getDataConstraint() + ", canAuthenticate="
|
||||||
|
+ cm.isAuthentication() + ", roles=" + cm.getRoles());
|
||||||
|
service.registerConstraintMapping(
|
||||||
|
cm.getConstraintName(),
|
||||||
|
cm.getMapping(),
|
||||||
|
cm.getUrl(),
|
||||||
|
cm.getDataConstraint(),
|
||||||
|
cm.isAuthentication(),
|
||||||
|
cm.getRoles(),
|
||||||
|
httpContext
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void removingWebContainerCallback(ServiceReference serviceReference) {
|
||||||
|
WebContainer service = (WebContainer)bundleContext.getService(serviceReference);
|
||||||
|
if (service != null) {
|
||||||
|
service.unregisterLoginConfig(httpContext);
|
||||||
|
service.unregisterConstraintMapping(httpContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
org.keycloak.adapters.osgi.undertow.KeycloakAuthenticatorService
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
<relativePath>../../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
<relativePath>../../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
<relativePath>../../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
<relativePath>../../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
<relativePath>../../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
<relativePath>../../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<name>Keycloak Jetty Integration</name>
|
<name>Keycloak Jetty Integration</name>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
+73
-10
@@ -18,7 +18,7 @@
|
|||||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
import * as Keycloak from 'keycloak';
|
import * as Keycloak from './keycloak';
|
||||||
|
|
||||||
export as namespace KeycloakAuthorization;
|
export as namespace KeycloakAuthorization;
|
||||||
|
|
||||||
@@ -35,6 +35,64 @@ declare namespace KeycloakAuthorization {
|
|||||||
then(onGrant: (rpt: string) => void, onDeny: () => void, onError: () => void): void;
|
then(onGrant: (rpt: string) => void, onDeny: () => void, onError: () => void): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface AuthorizationRequest {
|
||||||
|
/**
|
||||||
|
* An array of objects representing the resource and scopes.
|
||||||
|
*/
|
||||||
|
permissions?:ResourcePermission[],
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A permission ticket obtained from a resource server when using UMA authorization protocol.
|
||||||
|
*/
|
||||||
|
ticket?:string,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A boolean value indicating whether the server should create permission requests to the resources
|
||||||
|
* and scopes referenced by a permission ticket. This parameter will only take effect when used together
|
||||||
|
* with the ticket parameter as part of a UMA authorization process.
|
||||||
|
*/
|
||||||
|
submitRequest?:boolean,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines additional information about this authorization request in order to specify how it should be processed
|
||||||
|
* by the server.
|
||||||
|
*/
|
||||||
|
metadata?:AuthorizationRequestMetadata,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines whether or not this authorization request should include the current RPT. If set to true, the RPT will
|
||||||
|
* be sent and permissions in the current RPT will be included in the new RPT. Otherwise, only the permissions referenced in this
|
||||||
|
* authorization request will be granted in the new RPT.
|
||||||
|
*/
|
||||||
|
incrementalAuthorization?:boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
interface AuthorizationRequestMetadata {
|
||||||
|
/**
|
||||||
|
* A boolean value indicating to the server if resource names should be included in the RPT’s permissions.
|
||||||
|
* If false, only the resource identifier is included.
|
||||||
|
*/
|
||||||
|
responseIncludeResourceName?:any,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An integer N that defines a limit for the amount of permissions an RPT can have. When used together with
|
||||||
|
* rpt parameter, only the last N requested permissions will be kept in the RPT.
|
||||||
|
*/
|
||||||
|
response_permissions_limit?:number
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ResourcePermission {
|
||||||
|
/**
|
||||||
|
* The id or name of a resource.
|
||||||
|
*/
|
||||||
|
id:string,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An array of strings where each value is the name of a scope associated with the resource.
|
||||||
|
*/
|
||||||
|
scopes?:string[]
|
||||||
|
}
|
||||||
|
|
||||||
interface KeycloakAuthorizationInstance {
|
interface KeycloakAuthorizationInstance {
|
||||||
rpt: any;
|
rpt: any;
|
||||||
config: { rpt_endpoint: string };
|
config: { rpt_endpoint: string };
|
||||||
@@ -42,18 +100,23 @@ declare namespace KeycloakAuthorization {
|
|||||||
init(): void;
|
init(): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method enables client applications to better integrate with resource servers protected by a Keycloak
|
* This method enables client applications to better integrate with resource servers protected by a Keycloak
|
||||||
* policy enforcer.
|
* policy enforcer using UMA protocol.
|
||||||
*
|
*
|
||||||
* In this case, the resource server will respond with a 401 status code and a WWW-Authenticate header holding the
|
* The authorization request must be provided with a ticket.
|
||||||
* necessary information to ask a Keycloak server for authorization data using both UMA and Entitlement protocol,
|
*
|
||||||
* depending on how the policy enforcer at the resource server was configured.
|
* @param authorizationRequest An AuthorizationRequest instance with a valid permission ticket set.
|
||||||
*/
|
* @returns A promise to set functions to be invoked on grant, deny or error.
|
||||||
authorize(wwwAuthenticateHeader: string): KeycloakAuthorizationPromise;
|
*/
|
||||||
|
authorize(authorizationRequest: AuthorizationRequest): KeycloakAuthorizationPromise;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Obtains all entitlements from a Keycloak server based on a given resourceServerId.
|
* Obtains all entitlements from a Keycloak server based on a given resourceServerId.
|
||||||
|
*
|
||||||
|
* @param resourceServerId The id (client id) of the resource server to obtain permissions from.
|
||||||
|
* @param authorizationRequest An AuthorizationRequest instance.
|
||||||
|
* @returns A promise to set functions to be invoked on grant, deny or error.
|
||||||
*/
|
*/
|
||||||
entitlement(resourceServerId: string, entitlementRequest: {}): KeycloakAuthorizationPromise;
|
entitlement(resourceServerId: string, authorizationRequest?: AuthorizationRequest): KeycloakAuthorizationPromise;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -41,11 +41,9 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* This method enables client applications to better integrate with resource servers protected by a Keycloak
|
* This method enables client applications to better integrate with resource servers protected by a Keycloak
|
||||||
* policy enforcer.
|
* policy enforcer using UMA protocol.
|
||||||
*
|
*
|
||||||
* In this case, the resource server will respond with a 401 status code and a WWW-Authenticate header holding the
|
* The authorization request must be provided with a ticket.
|
||||||
* necessary information to ask a Keycloak server for authorization data using both UMA and Entitlement protocol,
|
|
||||||
* depending on how the policy enforcer at the resource server was configured.
|
|
||||||
*/
|
*/
|
||||||
this.authorize = function (authorizationRequest) {
|
this.authorize = function (authorizationRequest) {
|
||||||
this.then = function (onGrant, onDeny, onError) {
|
this.then = function (onGrant, onDeny, onError) {
|
||||||
@@ -205,6 +203,8 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
this.init(this);
|
this.init(this);
|
||||||
|
|
||||||
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
if ( typeof module === "object" && module && typeof module.exports === "object" ) {
|
if ( typeof module === "object" && module && typeof module.exports === "object" ) {
|
||||||
|
|||||||
@@ -1187,24 +1187,54 @@
|
|||||||
return window.open(loginUrl, target, options);
|
return window.open(loginUrl, target, options);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var shallowCloneCordovaOptions = function (userOptions) {
|
||||||
|
if (userOptions && userOptions.cordovaOptions) {
|
||||||
|
return Object.keys(userOptions.cordovaOptions).reduce(function (options, optionName) {
|
||||||
|
options[optionName] = userOptions.cordovaOptions[optionName];
|
||||||
|
return options;
|
||||||
|
}, {});
|
||||||
|
} else {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var formatCordovaOptions = function (cordovaOptions) {
|
||||||
|
return Object.keys(cordovaOptions).reduce(function (options, optionName) {
|
||||||
|
options.push(optionName+"="+cordovaOptions[optionName]);
|
||||||
|
return options;
|
||||||
|
}, []).join(",");
|
||||||
|
};
|
||||||
|
|
||||||
|
var createCordovaOptions = function (userOptions) {
|
||||||
|
var cordovaOptions = shallowCloneCordovaOptions(userOptions);
|
||||||
|
cordovaOptions.location = 'no';
|
||||||
|
if (userOptions && userOptions.prompt == 'none') {
|
||||||
|
cordovaOptions.hidden = 'yes';
|
||||||
|
}
|
||||||
|
return formatCordovaOptions(cordovaOptions);
|
||||||
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
login: function(options) {
|
login: function(options) {
|
||||||
var promise = createPromise();
|
var promise = createPromise();
|
||||||
|
|
||||||
var o = 'location=no';
|
var cordovaOptions = createCordovaOptions(options);
|
||||||
if (options && options.prompt == 'none') {
|
|
||||||
o += ',hidden=yes';
|
|
||||||
}
|
|
||||||
|
|
||||||
var loginUrl = kc.createLoginUrl(options);
|
var loginUrl = kc.createLoginUrl(options);
|
||||||
var ref = cordovaOpenWindowWrapper(loginUrl, '_blank', o);
|
var ref = cordovaOpenWindowWrapper(loginUrl, '_blank', cordovaOptions);
|
||||||
var completed = false;
|
var completed = false;
|
||||||
|
|
||||||
|
var closed = false;
|
||||||
|
var closeBrowser = function() {
|
||||||
|
closed = true;
|
||||||
|
ref.close();
|
||||||
|
};
|
||||||
|
|
||||||
ref.addEventListener('loadstart', function(event) {
|
ref.addEventListener('loadstart', function(event) {
|
||||||
if (event.url.indexOf('http://localhost') == 0) {
|
if (event.url.indexOf('http://localhost') == 0) {
|
||||||
var callback = parseCallback(event.url);
|
var callback = parseCallback(event.url);
|
||||||
processCallback(callback, promise);
|
processCallback(callback, promise);
|
||||||
ref.close();
|
closeBrowser();
|
||||||
completed = true;
|
completed = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -1214,21 +1244,29 @@
|
|||||||
if (event.url.indexOf('http://localhost') == 0) {
|
if (event.url.indexOf('http://localhost') == 0) {
|
||||||
var callback = parseCallback(event.url);
|
var callback = parseCallback(event.url);
|
||||||
processCallback(callback, promise);
|
processCallback(callback, promise);
|
||||||
ref.close();
|
closeBrowser();
|
||||||
completed = true;
|
completed = true;
|
||||||
} else {
|
} else {
|
||||||
promise.setError();
|
promise.setError();
|
||||||
ref.close();
|
closeBrowser();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ref.addEventListener('exit', function(event) {
|
||||||
|
if (!closed) {
|
||||||
|
promise.setError({
|
||||||
|
reason: "closed_by_user"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return promise.promise;
|
return promise.promise;
|
||||||
},
|
},
|
||||||
|
|
||||||
logout: function(options) {
|
logout: function(options) {
|
||||||
var promise = createPromise();
|
var promise = createPromise();
|
||||||
|
|
||||||
var logoutUrl = kc.createLogoutUrl(options);
|
var logoutUrl = kc.createLogoutUrl(options);
|
||||||
var ref = cordovaOpenWindowWrapper(logoutUrl, '_blank', 'location=no,hidden=yes');
|
var ref = cordovaOpenWindowWrapper(logoutUrl, '_blank', 'location=no,hidden=yes');
|
||||||
|
|
||||||
@@ -1263,7 +1301,8 @@
|
|||||||
|
|
||||||
register : function() {
|
register : function() {
|
||||||
var registerUrl = kc.createRegisterUrl();
|
var registerUrl = kc.createRegisterUrl();
|
||||||
var ref = cordovaOpenWindowWrapper(registerUrl, '_blank', 'location=no');
|
var cordovaOptions = createCordovaOptions(options);
|
||||||
|
var ref = cordovaOpenWindowWrapper(registerUrl, '_blank', cordovaOptions);
|
||||||
ref.addEventListener('loadstart', function(event) {
|
ref.addEventListener('loadstart', function(event) {
|
||||||
if (event.url.indexOf('http://localhost') == 0) {
|
if (event.url.indexOf('http://localhost') == 0) {
|
||||||
ref.close();
|
ref.close();
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
org.keycloak.adapters.osgi.*
|
org.keycloak.adapters.osgi.*
|
||||||
</keycloak.osgi.export>
|
</keycloak.osgi.export>
|
||||||
<keycloak.osgi.import>
|
<keycloak.osgi.import>
|
||||||
org.ops4j.pax.web.*;version="[3.0,5)",
|
org.ops4j.pax.web.*;version="[3.0,8)",
|
||||||
javax.servlet.*;version="[2.5,4)";resolution:=optional,
|
javax.servlet.*;version="[2.5,4)";resolution:=optional,
|
||||||
org.eclipse.jetty.*;version="[8.1,10)";resolution:=optional,
|
org.eclipse.jetty.*;version="[8.1,10)";resolution:=optional,
|
||||||
org.keycloak.*;version="${project.version}",
|
org.keycloak.*;version="${project.version}",
|
||||||
|
|||||||
+102
-7
@@ -29,11 +29,12 @@ import org.osgi.util.tracker.ServiceTrackerCustomizer;
|
|||||||
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Integration with pax-web, which allows to inject custom jetty-web.xml configuration from current bundle classpath into {@link WebContainer}
|
* Integration with pax-web in Fuse 6.3, which allows to inject custom jetty-web.xml configuration from current bundle classpath into {@link WebContainer}
|
||||||
* and allows to inject custom security constraint for securing resources by Keycloak.
|
* and allows to inject custom security constraint for securing resources by Keycloak.
|
||||||
*
|
*
|
||||||
* <p>It assumes that pax-web {@link WebContainer} is used as implementation of OSGI {@link org.osgi.service.http.HttpService}, which
|
* <p>It assumes that pax-web {@link WebContainer} is used as implementation of OSGI {@link org.osgi.service.http.HttpService}, which
|
||||||
@@ -47,7 +48,7 @@ public class PaxWebIntegrationService {
|
|||||||
|
|
||||||
private BundleContext bundleContext;
|
private BundleContext bundleContext;
|
||||||
private String jettyWebXmlLocation;
|
private String jettyWebXmlLocation;
|
||||||
private List<ConstraintMapping> constraintMappings; // Using jetty constraint mapping just because of compatibility with other fuse services
|
private List<Object> constraintMappings;
|
||||||
|
|
||||||
private ServiceTracker webContainerTracker;
|
private ServiceTracker webContainerTracker;
|
||||||
private HttpContext httpContext;
|
private HttpContext httpContext;
|
||||||
@@ -68,11 +69,11 @@ public class PaxWebIntegrationService {
|
|||||||
this.jettyWebXmlLocation = jettyWebXmlLocation;
|
this.jettyWebXmlLocation = jettyWebXmlLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<ConstraintMapping> getConstraintMappings() {
|
public List<Object> getConstraintMappings() {
|
||||||
return constraintMappings;
|
return constraintMappings;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setConstraintMappings(List<ConstraintMapping> constraintMappings) {
|
public void setConstraintMappings(List<Object> constraintMappings) {
|
||||||
this.constraintMappings = constraintMappings;
|
this.constraintMappings = constraintMappings;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,8 +121,25 @@ public class PaxWebIntegrationService {
|
|||||||
if (constraintMappings == null) {
|
if (constraintMappings == null) {
|
||||||
throw new IllegalStateException("constraintMappings was null!");
|
throw new IllegalStateException("constraintMappings was null!");
|
||||||
}
|
}
|
||||||
for (ConstraintMapping constraintMapping : constraintMappings) {
|
List<ConstraintHandler> handlers = new ArrayList<>();
|
||||||
addConstraintMapping(service, constraintMapping);
|
try {
|
||||||
|
handlers.add(new JettyConstraintHandler());
|
||||||
|
} catch (Throwable t) {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
handlers.add(new PaxWebConstraintHandler());
|
||||||
|
} catch (Throwable t) {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
|
for (Object constraintMapping : constraintMappings) {
|
||||||
|
boolean handled = false;
|
||||||
|
for (ConstraintHandler handler : handlers) {
|
||||||
|
handled |= handler.addConstraintMapping(httpContext, service, constraintMapping);
|
||||||
|
}
|
||||||
|
if (!handled) {
|
||||||
|
log.warnv("Unable to add constraint mapping for constraint of type " + constraintMapping.getClass().toString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
service.registerLoginConfig("BASIC", "does-not-matter", null, null, httpContext);
|
service.registerLoginConfig("BASIC", "does-not-matter", null, null, httpContext);
|
||||||
@@ -146,6 +164,16 @@ public class PaxWebIntegrationService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void addConstraintMapping(WebContainer service, PaxWebSecurityConstraintMapping constraintMapping) {
|
||||||
|
String name = constraintMapping.getConstraintName();
|
||||||
|
if (name == null) {
|
||||||
|
name = "Constraint-" + new SecureRandom().nextInt(Integer.MAX_VALUE);
|
||||||
|
}
|
||||||
|
log.debug("Adding security constraint name=" + name + ", url=" + constraintMapping.getUrl() + ", dataConstraint=" + constraintMapping.getDataConstraint() + ", canAuthenticate="
|
||||||
|
+ constraintMapping.isAuthentication() + ", roles=" + constraintMapping.getRoles());
|
||||||
|
service.registerConstraintMapping(name, constraintMapping.getUrl(), constraintMapping.getMapping(), constraintMapping.getDataConstraint(), constraintMapping.isAuthentication(), constraintMapping.getRoles(), httpContext);
|
||||||
|
}
|
||||||
|
|
||||||
protected void addConstraintMapping(WebContainer service, ConstraintMapping constraintMapping) {
|
protected void addConstraintMapping(WebContainer service, ConstraintMapping constraintMapping) {
|
||||||
Constraint constraint = constraintMapping.getConstraint();
|
Constraint constraint = constraintMapping.getConstraint();
|
||||||
String[] roles = constraint.getRoles();
|
String[] roles = constraint.getRoles();
|
||||||
@@ -178,4 +206,71 @@ public class PaxWebIntegrationService {
|
|||||||
service.unregisterConstraintMapping(httpContext);
|
service.unregisterConstraintMapping(httpContext);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private interface ConstraintHandler {
|
||||||
|
boolean addConstraintMapping(HttpContext httpContext, WebContainer service, Object cm);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class PaxWebConstraintHandler implements ConstraintHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean addConstraintMapping(HttpContext httpContext, WebContainer service, Object cm) {
|
||||||
|
if (cm instanceof PaxWebSecurityConstraintMapping) {
|
||||||
|
PaxWebSecurityConstraintMapping constraintMapping = (PaxWebSecurityConstraintMapping) cm;
|
||||||
|
String name = constraintMapping.getConstraintName();
|
||||||
|
if (name == null) {
|
||||||
|
name = "Constraint-" + new SecureRandom().nextInt(Integer.MAX_VALUE);
|
||||||
|
}
|
||||||
|
log.debug("Adding security constraint name=" + name + ", url=" + constraintMapping.getUrl() + ", dataConstraint=" + constraintMapping.getDataConstraint() + ", canAuthenticate="
|
||||||
|
+ constraintMapping.isAuthentication() + ", roles=" + constraintMapping.getRoles());
|
||||||
|
service.registerConstraintMapping(name, constraintMapping.getUrl(), constraintMapping.getMapping(), constraintMapping.getDataConstraint(), constraintMapping.isAuthentication(), constraintMapping.getRoles(), httpContext);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class JettyConstraintHandler implements ConstraintHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean addConstraintMapping(HttpContext httpContext, WebContainer service, Object cm) {
|
||||||
|
if (cm instanceof ConstraintMapping) {
|
||||||
|
ConstraintMapping constraintMapping = (ConstraintMapping) cm;
|
||||||
|
Constraint constraint = constraintMapping.getConstraint();
|
||||||
|
String[] roles = constraint.getRoles();
|
||||||
|
// name property is unavailable on constraint object :/
|
||||||
|
|
||||||
|
String name = "Constraint-" + new SecureRandom().nextInt(Integer.MAX_VALUE);
|
||||||
|
|
||||||
|
int dataConstraint = constraint.getDataConstraint();
|
||||||
|
String dataConstraintStr;
|
||||||
|
switch (dataConstraint) {
|
||||||
|
case Constraint.DC_UNSET:
|
||||||
|
dataConstraintStr = null;
|
||||||
|
break;
|
||||||
|
case Constraint.DC_NONE:
|
||||||
|
dataConstraintStr = "NONE";
|
||||||
|
break;
|
||||||
|
case Constraint.DC_CONFIDENTIAL:
|
||||||
|
dataConstraintStr = "CONFIDENTIAL";
|
||||||
|
break;
|
||||||
|
case Constraint.DC_INTEGRAL:
|
||||||
|
dataConstraintStr = "INTEGRAL";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
log.warnv("Unknown data constraint: " + dataConstraint);
|
||||||
|
dataConstraintStr = "CONFIDENTIAL";
|
||||||
|
}
|
||||||
|
List<String> rolesList = Arrays.asList(roles);
|
||||||
|
|
||||||
|
log.debug("Adding security constraint name=" + name + ", url=" + constraintMapping.getPathSpec() + ", dataConstraint=" + dataConstraintStr + ", canAuthenticate="
|
||||||
|
+ constraint.getAuthenticate() + ", roles=" + rolesList);
|
||||||
|
service.registerConstraintMapping(name, constraintMapping.getPathSpec(), null, dataConstraintStr, constraint.getAuthenticate(), rolesList, httpContext);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package org.keycloak.adapters.osgi;
|
||||||
|
|
||||||
|
import java.security.SecureRandom;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author hmlnarik
|
||||||
|
*/
|
||||||
|
public class PaxWebSecurityConstraintMapping {
|
||||||
|
|
||||||
|
private String constraintName = "Constraint-" + new SecureRandom().nextInt(Integer.MAX_VALUE);
|
||||||
|
private String mapping;
|
||||||
|
private String url;
|
||||||
|
private String dataConstraint = "NONE";
|
||||||
|
private boolean authentication = true;
|
||||||
|
private List<String> roles = new LinkedList<>();
|
||||||
|
|
||||||
|
public String getConstraintName() {
|
||||||
|
return constraintName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConstraintName(String constraintName) {
|
||||||
|
this.constraintName = constraintName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMapping() {
|
||||||
|
return mapping;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMapping(String mapping) {
|
||||||
|
this.mapping = mapping;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUrl() {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUrl(String url) {
|
||||||
|
this.url = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDataConstraint() {
|
||||||
|
return dataConstraint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDataConstraint(String dataConstraint) {
|
||||||
|
this.dataConstraint = dataConstraint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAuthentication() {
|
||||||
|
return authentication;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAuthentication(boolean authentication) {
|
||||||
|
this.authentication = authentication;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getRoles() {
|
||||||
|
return roles;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRoles(List<String> roles) {
|
||||||
|
this.roles = roles;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<name>Keycloak OIDC Client Adapter Modules</name>
|
<name>Keycloak OIDC Client Adapter Modules</name>
|
||||||
@@ -34,6 +34,7 @@
|
|||||||
<module>adapter-core</module>
|
<module>adapter-core</module>
|
||||||
<module>as7-eap6</module>
|
<module>as7-eap6</module>
|
||||||
<module>installed</module>
|
<module>installed</module>
|
||||||
|
<module>fuse7</module>
|
||||||
<module>kcinit</module>
|
<module>kcinit</module>
|
||||||
<module>jaxrs-oauth-client</module>
|
<module>jaxrs-oauth-client</module>
|
||||||
<module>jetty</module>
|
<module>jetty</module>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>spring-boot-container-bundle</artifactId>
|
<artifactId>spring-boot-container-bundle</artifactId>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<name>Keycloak Tomcat Integration</name>
|
<name>Keycloak Tomcat Integration</name>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-tomcat-integration-pom</artifactId>
|
<artifactId>keycloak-tomcat-integration-pom</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-tomcat-integration-pom</artifactId>
|
<artifactId>keycloak-tomcat-integration-pom</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-tomcat-integration-pom</artifactId>
|
<artifactId>keycloak-tomcat-integration-pom</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-tomcat-integration-pom</artifactId>
|
<artifactId>keycloak-tomcat-integration-pom</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
@@ -30,6 +30,15 @@
|
|||||||
<name>Keycloak Undertow Integration</name>
|
<name>Keycloak Undertow Integration</name>
|
||||||
<description/>
|
<description/>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<keycloak.osgi.export>
|
||||||
|
org.keycloak.adapters.undertow.*
|
||||||
|
</keycloak.osgi.export>
|
||||||
|
<keycloak.osgi.import>
|
||||||
|
*;resolution:=optional
|
||||||
|
</keycloak.osgi.import>
|
||||||
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jboss.logging</groupId>
|
<groupId>org.jboss.logging</groupId>
|
||||||
@@ -105,6 +114,39 @@
|
|||||||
<target>${maven.compiler.target}</target>
|
<target>${maven.compiler.target}</target>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Adding OSGI metadata to the JAR without changing the packaging type. -->
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<archive>
|
||||||
|
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
|
||||||
|
</archive>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.felix</groupId>
|
||||||
|
<artifactId>maven-bundle-plugin</artifactId>
|
||||||
|
<extensions>true</extensions>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>bundle-manifest</id>
|
||||||
|
<phase>process-classes</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>manifest</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<instructions>
|
||||||
|
<Bundle-ClassPath>.</Bundle-ClassPath>
|
||||||
|
<Bundle-Name>${project.name}</Bundle-Name>
|
||||||
|
<Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
|
||||||
|
<Import-Package>${keycloak.osgi.import}</Import-Package>
|
||||||
|
<Export-Package>${keycloak.osgi.export}</Export-Package>
|
||||||
|
</instructions>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<name>Keycloak WildFly Integration</name>
|
<name>Keycloak WildFly Integration</name>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
<relativePath>../../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
<relativePath>../../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
<relativePath>../../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<name>Keycloak Adapters</name>
|
<name>Keycloak Adapters</name>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-saml-eap-integration-pom</artifactId>
|
<artifactId>keycloak-saml-eap-integration-pom</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<name>Keycloak SAML EAP Integration</name>
|
<name>Keycloak SAML EAP Integration</name>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-saml-eap-integration-pom</artifactId>
|
<artifactId>keycloak-saml-eap-integration-pom</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
<relativePath>../../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
<relativePath>../../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
<relativePath>../../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
<relativePath>../../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
<relativePath>../../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
<relativePath>../../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<name>Keycloak SAML Jetty Integration</name>
|
<name>Keycloak SAML Jetty Integration</name>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<name>Keycloak SAML Client Adapter Modules</name>
|
<name>Keycloak SAML Client Adapter Modules</name>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<name>Keycloak SAML Tomcat Integration</name>
|
<name>Keycloak SAML Tomcat Integration</name>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-saml-tomcat-integration-pom</artifactId>
|
<artifactId>keycloak-saml-tomcat-integration-pom</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-saml-tomcat-integration-pom</artifactId>
|
<artifactId>keycloak-saml-tomcat-integration-pom</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-saml-tomcat-integration-pom</artifactId>
|
<artifactId>keycloak-saml-tomcat-integration-pom</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-saml-tomcat-integration-pom</artifactId>
|
<artifactId>keycloak-saml-tomcat-integration-pom</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<name>Keycloak SAML Wildfly Integration</name>
|
<name>Keycloak SAML Wildfly Integration</name>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
<relativePath>../../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../../pom.xml</relativePath>
|
<relativePath>../../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<name>Keycloak Client Adapter SPI Modules</name>
|
<name>Keycloak Client Adapter SPI Modules</name>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -21,15 +21,25 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../../../pom.xml</relativePath>
|
<relativePath>../../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<artifactId>keycloak-undertow-adapter-spi</artifactId>
|
<artifactId>keycloak-undertow-adapter-spi</artifactId>
|
||||||
<name>Keycloak Undertow Integration</name>
|
<name>Keycloak Undertow Integration SPI</name>
|
||||||
<description/>
|
<description/>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<keycloak.osgi.export>
|
||||||
|
org.keycloak.adapters.undertow.*
|
||||||
|
</keycloak.osgi.export>
|
||||||
|
<keycloak.osgi.import>
|
||||||
|
*;resolution:=optional
|
||||||
|
</keycloak.osgi.import>
|
||||||
|
<keycloak.osgi.fragment>${project.groupId}.keycloak-undertow-adapter</keycloak.osgi.fragment>
|
||||||
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jboss.logging</groupId>
|
<groupId>org.jboss.logging</groupId>
|
||||||
@@ -76,6 +86,40 @@
|
|||||||
<target>${maven.compiler.target}</target>
|
<target>${maven.compiler.target}</target>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Adding OSGI metadata to the JAR without changing the packaging type. -->
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<archive>
|
||||||
|
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
|
||||||
|
</archive>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.felix</groupId>
|
||||||
|
<artifactId>maven-bundle-plugin</artifactId>
|
||||||
|
<extensions>true</extensions>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>bundle-manifest</id>
|
||||||
|
<phase>process-classes</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>manifest</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<instructions>
|
||||||
|
<Bundle-ClassPath>.</Bundle-ClassPath>
|
||||||
|
<Bundle-Name>${project.name}</Bundle-Name>
|
||||||
|
<Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
|
||||||
|
<Import-Package>${keycloak.osgi.import}</Import-Package>
|
||||||
|
<Export-Package>${keycloak.osgi.export}</Export-Package>
|
||||||
|
<Fragment-Host>${keycloak.osgi.fragment}</Fragment-Host>
|
||||||
|
</instructions>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-authz-parent</artifactId>
|
<artifactId>keycloak-authz-parent</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
+39
-4
@@ -94,6 +94,41 @@ public class PermissionResource {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new uma permission for a single resource and scope(s).
|
||||||
|
*
|
||||||
|
* @param ticket the {@link PermissionTicketRepresentation} representing the resource and scope(s) (not {@code null})
|
||||||
|
* @return a permission response holding the permission ticket representation
|
||||||
|
*/
|
||||||
|
public PermissionTicketRepresentation create(final PermissionTicketRepresentation ticket) {
|
||||||
|
if (ticket == null) {
|
||||||
|
throw new IllegalArgumentException("Permission ticket must not be null or empty");
|
||||||
|
}
|
||||||
|
if (ticket.getRequester() == null || ticket.getRequesterName() == null) {
|
||||||
|
throw new IllegalArgumentException("Permission ticket must have a requester");
|
||||||
|
}
|
||||||
|
if (ticket.getResource() == null || ticket.getResourceName() == null) {
|
||||||
|
throw new IllegalArgumentException("Permission ticket must have a resource");
|
||||||
|
}
|
||||||
|
if (ticket.getScope() == null || ticket.getScopeName() == null) {
|
||||||
|
throw new IllegalArgumentException("Permission ticket must have a scope");
|
||||||
|
}
|
||||||
|
Callable<PermissionTicketRepresentation> callable = new Callable<PermissionTicketRepresentation>() {
|
||||||
|
@Override
|
||||||
|
public PermissionTicketRepresentation call() throws Exception {
|
||||||
|
return http.<PermissionTicketRepresentation>post(serverConfiguration.getPermissionEndpoint()+"/ticket")
|
||||||
|
.json(JsonSerialization.writeValueAsBytes(ticket))
|
||||||
|
.authorizationBearer(pat.call())
|
||||||
|
.response().json(new TypeReference<PermissionTicketRepresentation>(){}).execute();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
return callable.call();
|
||||||
|
} catch (Exception cause) {
|
||||||
|
return Throwables.retryAndWrapExceptionIfNecessary(callable, pat, "Error updating permission ticket", cause);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Query the server for any permission ticket associated with the given <code>scopeId</code>.
|
* Query the server for any permission ticket associated with the given <code>scopeId</code>.
|
||||||
*
|
*
|
||||||
@@ -107,7 +142,7 @@ public class PermissionResource {
|
|||||||
Callable<List<PermissionTicketRepresentation>> callable = new Callable<List<PermissionTicketRepresentation>>() {
|
Callable<List<PermissionTicketRepresentation>> callable = new Callable<List<PermissionTicketRepresentation>>() {
|
||||||
@Override
|
@Override
|
||||||
public List<PermissionTicketRepresentation> call() throws Exception {
|
public List<PermissionTicketRepresentation> call() throws Exception {
|
||||||
return http.<List<PermissionTicketRepresentation>>get(serverConfiguration.getPermissionEndpoint())
|
return http.<List<PermissionTicketRepresentation>>get(serverConfiguration.getPermissionEndpoint()+"/ticket")
|
||||||
.authorizationBearer(pat.call())
|
.authorizationBearer(pat.call())
|
||||||
.param("scopeId", scopeId)
|
.param("scopeId", scopeId)
|
||||||
.response().json(new TypeReference<List<PermissionTicketRepresentation>>(){}).execute();
|
.response().json(new TypeReference<List<PermissionTicketRepresentation>>(){}).execute();
|
||||||
@@ -133,7 +168,7 @@ public class PermissionResource {
|
|||||||
Callable<List<PermissionTicketRepresentation>> callable = new Callable<List<PermissionTicketRepresentation>>() {
|
Callable<List<PermissionTicketRepresentation>> callable = new Callable<List<PermissionTicketRepresentation>>() {
|
||||||
@Override
|
@Override
|
||||||
public List<PermissionTicketRepresentation> call() throws Exception {
|
public List<PermissionTicketRepresentation> call() throws Exception {
|
||||||
return http.<List<PermissionTicketRepresentation>>get(serverConfiguration.getPermissionEndpoint())
|
return http.<List<PermissionTicketRepresentation>>get(serverConfiguration.getPermissionEndpoint()+"/ticket")
|
||||||
.authorizationBearer(pat.call())
|
.authorizationBearer(pat.call())
|
||||||
.param("resourceId", resourceId)
|
.param("resourceId", resourceId)
|
||||||
.response().json(new TypeReference<List<PermissionTicketRepresentation>>(){}).execute();
|
.response().json(new TypeReference<List<PermissionTicketRepresentation>>(){}).execute();
|
||||||
@@ -170,7 +205,7 @@ public class PermissionResource {
|
|||||||
Callable<List<PermissionTicketRepresentation>> callable = new Callable<List<PermissionTicketRepresentation>>() {
|
Callable<List<PermissionTicketRepresentation>> callable = new Callable<List<PermissionTicketRepresentation>>() {
|
||||||
@Override
|
@Override
|
||||||
public List<PermissionTicketRepresentation> call() throws Exception {
|
public List<PermissionTicketRepresentation> call() throws Exception {
|
||||||
return http.<List<PermissionTicketRepresentation>>get(serverConfiguration.getPermissionEndpoint())
|
return http.<List<PermissionTicketRepresentation>>get(serverConfiguration.getPermissionEndpoint()+"/ticket")
|
||||||
.authorizationBearer(pat.call())
|
.authorizationBearer(pat.call())
|
||||||
.param("resourceId", resourceId)
|
.param("resourceId", resourceId)
|
||||||
.param("scopeId", scopeId)
|
.param("scopeId", scopeId)
|
||||||
@@ -205,7 +240,7 @@ public class PermissionResource {
|
|||||||
Callable callable = new Callable() {
|
Callable callable = new Callable() {
|
||||||
@Override
|
@Override
|
||||||
public Object call() throws Exception {
|
public Object call() throws Exception {
|
||||||
http.<List>put(serverConfiguration.getPermissionEndpoint())
|
http.<List>put(serverConfiguration.getPermissionEndpoint()+"/ticket")
|
||||||
.json(JsonSerialization.writeValueAsBytes(ticket))
|
.json(JsonSerialization.writeValueAsBytes(ticket))
|
||||||
.authorizationBearer(pat.call())
|
.authorizationBearer(pat.call())
|
||||||
.response().json(List.class).execute();
|
.response().json(List.class).execute();
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-authz-provider-parent</artifactId>
|
<artifactId>keycloak-authz-provider-parent</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-authz-provider-parent</artifactId>
|
<artifactId>keycloak-authz-provider-parent</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-authz-parent</artifactId>
|
<artifactId>keycloak-authz-parent</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-parent</artifactId>
|
<artifactId>keycloak-parent</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
+23
-23
@@ -22,7 +22,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.keycloak.bom</groupId>
|
<groupId>org.keycloak.bom</groupId>
|
||||||
<artifactId>keycloak-bom-parent</artifactId>
|
<artifactId>keycloak-bom-parent</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<groupId>org.keycloak.bom</groupId>
|
<groupId>org.keycloak.bom</groupId>
|
||||||
@@ -37,112 +37,112 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-core</artifactId>
|
<artifactId>keycloak-core</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-adapter-core</artifactId>
|
<artifactId>keycloak-adapter-core</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-adapter-spi</artifactId>
|
<artifactId>keycloak-adapter-spi</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-wildfly-adapter-dist</artifactId>
|
<artifactId>keycloak-wildfly-adapter-dist</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-saml-adapter-core</artifactId>
|
<artifactId>keycloak-saml-adapter-core</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-saml-adapter-api-public</artifactId>
|
<artifactId>keycloak-saml-adapter-api-public</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-tomcat8-adapter</artifactId>
|
<artifactId>keycloak-tomcat8-adapter</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-tomcat7-adapter</artifactId>
|
<artifactId>keycloak-tomcat7-adapter</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-tomcat6-adapter</artifactId>
|
<artifactId>keycloak-tomcat6-adapter</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-jetty81-adapter</artifactId>
|
<artifactId>keycloak-jetty81-adapter</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-jetty91-adapter</artifactId>
|
<artifactId>keycloak-jetty91-adapter</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-jetty92-adapter</artifactId>
|
<artifactId>keycloak-jetty92-adapter</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-jetty93-adapter</artifactId>
|
<artifactId>keycloak-jetty93-adapter</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-undertow-adapter</artifactId>
|
<artifactId>keycloak-undertow-adapter</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-spring-boot-adapter</artifactId>
|
<artifactId>keycloak-spring-boot-adapter</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-spring-boot-2-adapter</artifactId>
|
<artifactId>keycloak-spring-boot-2-adapter</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>spring-boot-container-bundle</artifactId>
|
<artifactId>spring-boot-container-bundle</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-spring-security-adapter</artifactId>
|
<artifactId>keycloak-spring-security-adapter</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-spring-boot-starter</artifactId>
|
<artifactId>keycloak-spring-boot-starter</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-spring-boot-2-starter</artifactId>
|
<artifactId>keycloak-spring-boot-2-starter</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-spring-boot-2-starter</artifactId>
|
<artifactId>keycloak-spring-boot-2-starter</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.keycloak</groupId>
|
<groupId>org.keycloak</groupId>
|
||||||
<artifactId>keycloak-authz-client</artifactId>
|
<artifactId>keycloak-authz-client</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
|||||||
+1
-1
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
<groupId>org.keycloak.bom</groupId>
|
<groupId>org.keycloak.bom</groupId>
|
||||||
<artifactId>keycloak-bom-parent</artifactId>
|
<artifactId>keycloak-bom-parent</artifactId>
|
||||||
<version>4.0.0.Beta2-SNAPSHOT</version>
|
<version>4.0.0.Beta3</version>
|
||||||
|
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
|||||||
Loaded 100 of 461 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user