diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml
index c880abf01..9e22ffa7b 100644
--- a/.github/workflows/continuous-integration.yml
+++ b/.github/workflows/continuous-integration.yml
@@ -218,6 +218,7 @@ jobs:
matrix:
module:
- taskana-common
+ - taskana-common-security
- taskana-common-data
- taskana-common-test
- taskana-core
@@ -347,7 +348,7 @@ jobs:
./mvnw -B deploy -P $([[ "$GITHUB_REF" =~ ^refs/tags/v[0-9]+\.[0-9]+\.[0-9]+$ ]] && echo "release" || echo "snapshot") \
--settings ci/mvnsettings.xml -DskipTests -Dcheckstyle.skip -Dasciidoctor.skip -Djacoco.skip \
-pl :taskana-parent,\
- :taskana-common-parent,:taskana-common,:taskana-common-data,:taskana-common-test,\
+ :taskana-common-parent,:taskana-common,:taskana-common-security,:taskana-common-data,:taskana-common-test,\
:taskana-lib-parent,:taskana-core,:taskana-cdi,:taskana-spring,\
:taskana-rest-parent,:taskana-web,:taskana-rest-spring,\
:taskana-history-parent,:taskana-simplehistory-provider,:taskana-simplehistory-rest-spring,:taskana-loghistory-provider
diff --git a/common/pom.xml b/common/pom.xml
index f20e2571c..98e98d3ff 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -18,6 +18,7 @@
taskana-common
+ taskana-common-security
taskana-common-data
taskana-common-test
diff --git a/common/taskana-common-security/pom.xml b/common/taskana-common-security/pom.xml
new file mode 100644
index 000000000..4ee8f8db9
--- /dev/null
+++ b/common/taskana-common-security/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+ taskana-common-security
+
+ ${project.groupId}:${project.artifactId}
+ The global security principals needed for user and group authentication
+
+
+ taskana-common-parent
+ pro.taskana
+ 4.3.1-SNAPSHOT
+
+
+
+
+ org.slf4j
+ slf4j-api
+
+
+
diff --git a/common/taskana-common/src/main/java/pro/taskana/common/api/security/CurrentUserContext.java b/common/taskana-common-security/src/main/java/pro/taskana/common/api/security/CurrentUserContext.java
similarity index 100%
rename from common/taskana-common/src/main/java/pro/taskana/common/api/security/CurrentUserContext.java
rename to common/taskana-common-security/src/main/java/pro/taskana/common/api/security/CurrentUserContext.java
diff --git a/common/taskana-common/src/main/java/pro/taskana/common/api/security/GroupPrincipal.java b/common/taskana-common-security/src/main/java/pro/taskana/common/api/security/GroupPrincipal.java
similarity index 100%
rename from common/taskana-common/src/main/java/pro/taskana/common/api/security/GroupPrincipal.java
rename to common/taskana-common-security/src/main/java/pro/taskana/common/api/security/GroupPrincipal.java
diff --git a/common/taskana-common/src/main/java/pro/taskana/common/api/security/UserPrincipal.java b/common/taskana-common-security/src/main/java/pro/taskana/common/api/security/UserPrincipal.java
similarity index 100%
rename from common/taskana-common/src/main/java/pro/taskana/common/api/security/UserPrincipal.java
rename to common/taskana-common-security/src/main/java/pro/taskana/common/api/security/UserPrincipal.java
diff --git a/common/taskana-common/src/main/java/pro/taskana/common/internal/security/CurrentUserContextImpl.java b/common/taskana-common-security/src/main/java/pro/taskana/common/internal/security/CurrentUserContextImpl.java
similarity index 82%
rename from common/taskana-common/src/main/java/pro/taskana/common/internal/security/CurrentUserContextImpl.java
rename to common/taskana-common-security/src/main/java/pro/taskana/common/internal/security/CurrentUserContextImpl.java
index b1e8efd2d..48dc05855 100644
--- a/common/taskana-common/src/main/java/pro/taskana/common/internal/security/CurrentUserContextImpl.java
+++ b/common/taskana-common-security/src/main/java/pro/taskana/common/internal/security/CurrentUserContextImpl.java
@@ -1,7 +1,5 @@
package pro.taskana.common.internal.security;
-import static pro.taskana.common.internal.util.CheckedFunction.wrap;
-
import java.lang.reflect.Method;
import java.security.AccessController;
import java.security.Principal;
@@ -87,12 +85,22 @@ public class CurrentUserContextImpl implements CurrentUserContext {
LOGGER.debug("Public credentials of caller: {}", publicCredentials);
return publicCredentials.stream()
.map(
- wrap(
- credential ->
- credential
- .getClass()
- .getMethod(GET_UNIQUE_SECURITY_NAME_METHOD, (Class>[]) null)
- .invoke(credential, (Object[]) null)))
+ // we could use CheckedFunction#wrap here, but this either requires a dependency
+ // to taskana-common or an inclusion of the class CheckedFunction in this module.
+ // The first is not possible due to a cyclic dependency.
+ // The second is not desired, since this module is a very slim security module and
+ // the inclusion of CheckedFunction and its transitive dependencies would increase
+ // the module scope and introduce inconsistency.
+ credential -> {
+ try {
+ return credential
+ .getClass()
+ .getMethod(GET_UNIQUE_SECURITY_NAME_METHOD, (Class>[]) null)
+ .invoke(credential, (Object[]) null);
+ } catch (Exception e) {
+ throw new SecurityException("Could not retrieve principal", e);
+ }
+ })
.peek(
o ->
LOGGER.debug(
diff --git a/common/taskana-common/pom.xml b/common/taskana-common/pom.xml
index dac13a3fb..3ae170332 100644
--- a/common/taskana-common/pom.xml
+++ b/common/taskana-common/pom.xml
@@ -15,6 +15,11 @@
+
+ pro.taskana
+ taskana-common-security
+ ${project.version}
+
org.json
json