SI-2473-Acknowledge-Client-Roles
diff --git a/src/main/java/org/eclipse/openk/portal/auth2/model/KeyCloakClientRoles.java b/src/main/java/org/eclipse/openk/portal/auth2/model/KeyCloakClientRoles.java new file mode 100644 index 0000000..6536a21 --- /dev/null +++ b/src/main/java/org/eclipse/openk/portal/auth2/model/KeyCloakClientRoles.java
@@ -0,0 +1,45 @@ +/** +****************************************************************************** +* Copyright © 2017-2018 PTA GmbH. +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* +* http://www.eclipse.org/legal/epl-v10.html +* +****************************************************************************** +*/ +package org.eclipse.openk.portal.auth2.model; + +import java.util.List; + +public class KeyCloakClientRoles { + + private String id; + private String client; + private List<KeyCloakRole> mappings; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getClient() { + return client; + } + + public void setClient(String client) { + this.client = client; + } + + public List<KeyCloakRole> getMappings() { + return mappings; + } + + public void setMappings(List<KeyCloakRole> mappings) { + this.mappings = mappings; + } +}
diff --git a/src/main/java/org/eclipse/openk/portal/auth2/model/KeyCloakRoles.java b/src/main/java/org/eclipse/openk/portal/auth2/model/KeyCloakRoles.java new file mode 100644 index 0000000..643b105 --- /dev/null +++ b/src/main/java/org/eclipse/openk/portal/auth2/model/KeyCloakRoles.java
@@ -0,0 +1,38 @@ +/** +****************************************************************************** +* Copyright © 2017-2018 PTA GmbH. +* All rights reserved. This program and the accompanying materials +* are made available under the terms of the Eclipse Public License v1.0 +* which accompanies this distribution, and is available at +* +* http://www.eclipse.org/legal/epl-v10.html +* +****************************************************************************** +*/ +package org.eclipse.openk.portal.auth2.model; + +import java.util.List; +import java.util.Map; + +public class KeyCloakRoles { + + List<KeyCloakRole> realmMappings; + + private Map<String, KeyCloakClientRoles> clientMappings; + + public List<KeyCloakRole> getRealmMappings() { + return realmMappings; + } + + public void setRealmMappings(List<KeyCloakRole> realmMappings) { + this.realmMappings = realmMappings; + } + + public Map<String, KeyCloakClientRoles> getClientMappings() { + return clientMappings; + } + + public void setClientMappings(Map<String, KeyCloakClientRoles> clientMappings) { + this.clientMappings = clientMappings; + } +}
diff --git a/src/main/java/org/eclipse/openk/portal/auth2/model/KeyCloakUser.java b/src/main/java/org/eclipse/openk/portal/auth2/model/KeyCloakUser.java index 67bc1ce..58aeb90 100644 --- a/src/main/java/org/eclipse/openk/portal/auth2/model/KeyCloakUser.java +++ b/src/main/java/org/eclipse/openk/portal/auth2/model/KeyCloakUser.java
@@ -24,6 +24,7 @@ private String firstName; private String lastName; private String name; + private List<String> allRoles; private List<String> realmRoles; private Map<String, List<String>> clientRoles; @@ -75,6 +76,14 @@ return emailVerified; } + public List<String> getAllRoles() { + return allRoles; + } + + public void setAllRoles(List<String> allRoles) { + this.allRoles = allRoles; + } + public List<String> getRealmRoles() { return realmRoles; }
diff --git a/src/main/java/org/eclipse/openk/portal/auth2/util/JwtHelper.java b/src/main/java/org/eclipse/openk/portal/auth2/util/JwtHelper.java index c830013..afd04df 100644 --- a/src/main/java/org/eclipse/openk/portal/auth2/util/JwtHelper.java +++ b/src/main/java/org/eclipse/openk/portal/auth2/util/JwtHelper.java
@@ -18,7 +18,9 @@ import org.eclipse.openk.portal.auth2.model.JwtHeader; import org.eclipse.openk.portal.auth2.model.JwtPayload; import org.eclipse.openk.portal.auth2.model.JwtToken; +import org.eclipse.openk.portal.auth2.model.KeyCloakClientRoles; import org.eclipse.openk.portal.auth2.model.KeyCloakRole; +import org.eclipse.openk.portal.auth2.model.KeyCloakRoles; import org.eclipse.openk.portal.auth2.model.KeyCloakUser; import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; @@ -26,13 +28,18 @@ import java.lang.reflect.Type; import java.net.HttpURLConnection; import java.net.URL; +import java.util.ArrayList; import java.util.List; +import java.util.Map; + import org.apache.log4j.Logger; import org.eclipse.openk.portal.common.BackendConfig; import org.eclipse.openk.portal.common.JsonGeneratorBase; import org.eclipse.openk.portal.exceptions.PortalInternalServerError; import org.keycloak.common.util.Base64Url; +import static org.eclipse.openk.portal.common.JsonGeneratorBase.getGson; + public class JwtHelper { private static final Logger logger = Logger.getLogger(JwtHelper.class.getName()); @@ -69,7 +76,7 @@ } public static List<KeyCloakRole> getRolesForUser(JwtToken jwtToken, String id) throws PortalInternalServerError { - String roles = sendGet(BackendConfig.getInstance().getAuthServerUrl() + "auth/admin/realms/" + BackendConfig.getInstance().getKeycloakRealm() + "/users/" + id + "/role-mappings/realm", + String roles = sendGet(BackendConfig.getInstance().getAuthServerUrl() + "auth/admin/realms/" + BackendConfig.getInstance().getKeycloakRealm() + "/users/" + id + "/role-mappings/", MediaType.APPLICATION_JSON, jwtToken.getAccessToken()); return getRolesListFromJson(roles); } @@ -99,9 +106,24 @@ public static List<KeyCloakRole> getRolesListFromJson(String json) throws PortalInternalServerError { try { - Type listType = new TypeToken<List<KeyCloakRole>>() { - }.getType(); - return JsonGeneratorBase.getGson().fromJson(json, listType); + List<KeyCloakRole> allRoles = new ArrayList<>(); + KeyCloakRoles keyCloakRoles = getGson().fromJson(json, KeyCloakRoles.class); + List<KeyCloakRole> realmRoles = keyCloakRoles.getRealmMappings(); + + if (realmRoles != null) { + allRoles.addAll(realmRoles); + } + + Map<String, KeyCloakClientRoles> clientMappings = keyCloakRoles.getClientMappings(); + if (clientMappings != null) { + KeyCloakClientRoles keyCloakClientRoles = clientMappings.get(BackendConfig.getInstance().getKeycloakClient()); + if (keyCloakClientRoles != null){ + List<KeyCloakRole> clientRoles = keyCloakClientRoles.getMappings(); + allRoles.addAll(clientRoles); + } + } + + return allRoles; } catch (JsonSyntaxException ex) { logger.error("Error in getRolesListFromJson", ex); throw new PortalInternalServerError("JsonSyntaxException");
diff --git a/src/main/java/org/eclipse/openk/portal/common/UserCacheTimerTask.java b/src/main/java/org/eclipse/openk/portal/common/UserCacheTimerTask.java index e4d572c..3a192f1 100644 --- a/src/main/java/org/eclipse/openk/portal/common/UserCacheTimerTask.java +++ b/src/main/java/org/eclipse/openk/portal/common/UserCacheTimerTask.java
@@ -63,7 +63,7 @@ for (KeyCloakRole keyCloakRole : rolesForUser) { rolesList.add(keyCloakRole.getName()); } - user.setRealmRoles(rolesList); + user.setAllRoles(rolesList); allUsersWithRoles.add(user); } return allUsersWithRoles;
diff --git a/src/main/java/org/eclipse/openk/portal/controller/BackendController.java b/src/main/java/org/eclipse/openk/portal/controller/BackendController.java index caf8388..495bd77 100644 --- a/src/main/java/org/eclipse/openk/portal/controller/BackendController.java +++ b/src/main/java/org/eclipse/openk/portal/controller/BackendController.java
@@ -36,13 +36,13 @@ List<KeyCloakUser> keyCloakUsers = UserCache.getInstance().getKeyCloakUsers(); for (KeyCloakUser user : keyCloakUsers) { - List<String> realmRoles = user.getRealmRoles(); - if (realmRoles == null) { + List<String> allRoles = user.getAllRoles(); + if (allRoles == null) { continue; } - for (String realmRole : realmRoles) { - if(realmRole.equals(roleToCheck)){ + for (String role : allRoles) { + if(role.equals(roleToCheck)){ usersWithRole.add(user); break; }
diff --git a/src/main/resources/backendConfigDevLocal.json b/src/main/resources/backendConfigDevLocal.json index 430658e..38dd236 100644 --- a/src/main/resources/backendConfigDevLocal.json +++ b/src/main/resources/backendConfigDevLocal.json
@@ -1,8 +1,8 @@ { "internalSessionLengthMillis": 3600000, "reloadUsersInSec": 300, - "authServerUrl": "http://entjava002:8080/", - "keycloakRealm": "elogbook", + "authServerUrl": "http://entopkon:8080/", + "keycloakRealm": "Elogbook", "keycloakClient": "elogbook-backend", "keycloakAdmin": "admin", "keycloakPW": "admin",
diff --git a/src/main/resources/moduleConfigDevLocal.json b/src/main/resources/moduleConfigDevLocal.json index da34f80..3010aeb 100644 --- a/src/main/resources/moduleConfigDevLocal.json +++ b/src/main/resources/moduleConfigDevLocal.json
@@ -35,5 +35,23 @@ "link": "http://localhost:4220/", "pictureLink": "https://www.openkonsequenz.de//components/com_flexicontent/librairies/phpthumb/phpThumb.php?src=/medien/cache/main_image/l_ok_module5.jpg", "requiredRole": "planned-policies-access" + }, + { + "name": "Kontaktstammdaten", + "cols": 1, + "rows": 1, + "color": "#ffffff", + "link": "http://entdockergss:4222", + "pictureLink": "assets/img/kontaktstammdaten_kachel.jpg", + "requiredRole": "kon-access" + }, + { + "name": "Kontaktstammdaten Local", + "cols": 1, + "rows": 1, + "color": "#ffffff", + "link": "http://localhost:4200", + "pictureLink": "assets/img/kontaktstammdaten_kachel.jpg", + "requiredRole": "kon-access" } ]
diff --git a/src/test/java/org/eclipse/openk/portal/common/UserCacheTimerTaskTest.java b/src/test/java/org/eclipse/openk/portal/common/UserCacheTimerTaskTest.java index 1c3e49a..cf4f250 100644 --- a/src/test/java/org/eclipse/openk/portal/common/UserCacheTimerTaskTest.java +++ b/src/test/java/org/eclipse/openk/portal/common/UserCacheTimerTaskTest.java
@@ -23,9 +23,11 @@ import java.util.List; import org.eclipse.openk.portal.auth2.model.JwtToken; import org.eclipse.openk.portal.auth2.model.KeyCloakRole; +import org.eclipse.openk.portal.auth2.model.KeyCloakRoles; import org.eclipse.openk.portal.auth2.model.KeyCloakUser; import org.eclipse.openk.portal.auth2.util.JwtHelper; import org.eclipse.openk.portal.common.util.ResourceLoaderBase; +import org.eclipse.openk.portal.exceptions.PortalInternalServerError; import org.eclipse.openk.portal.viewmodel.UserCache; import org.junit.Before; import org.junit.Test; @@ -43,7 +45,6 @@ @Before public void prepareTests() { task = new UserCacheTimerTask(); - PowerMock.mockStatic(JwtHelper.class); } @Test @@ -53,14 +54,14 @@ String jsonKeyCloakUser = super.loadStringFromResource("testKeyCloakUsers.json"); Type listTypeKeyCloakUser = new TypeToken<List<KeyCloakUser>>(){}.getType(); - List<KeyCloakUser> keyCloakUsersList = JsonGeneratorBase.getGson().fromJson(jsonKeyCloakUser, listTypeKeyCloakUser); + List<KeyCloakUser> keyCloakUsersList = getGson().fromJson(jsonKeyCloakUser, listTypeKeyCloakUser); keyCloakUsersList.remove(1); keyCloakUsersList.remove(1); - String jsonKeyCloakRoles = super.loadStringFromResource("testKeyCloakRoles.json"); - Type listTypeKeyCloakRole = new TypeToken<List<KeyCloakRole>>(){}.getType(); - List<KeyCloakRole> keyCloakRolesList = JsonGeneratorBase.getGson().fromJson(jsonKeyCloakRoles, listTypeKeyCloakRole); + String jsonKeyCloakRoles = super.loadStringFromResource("testKeyCloakClientAndRealmRoles.json"); + List<KeyCloakRole> keyCloakRolesList = JwtHelper.getRolesListFromJson(jsonKeyCloakRoles); + PowerMock.mockStatic(JwtHelper.class); expect(JwtHelper.login(BackendConfig.getInstance().getKeycloakAdmin(), BackendConfig.getInstance().getKeycloakPW())).andReturn(jwt); expect(JwtHelper.getUsers(jwt, BackendConfig.getInstance().getMaxLoadUsers())).andReturn(keyCloakUsersList); expect(JwtHelper.getRolesForUser(jwt, keyCloakUsersList.get(0).getId())).andReturn(keyCloakRolesList); @@ -71,14 +72,15 @@ List<KeyCloakUser> keyCloakUsersResult = UserCache.getInstance().getKeyCloakUsers(); - assertTrue(keyCloakUsersResult.size() == 1); - assertTrue(keyCloakUsersResult.get(0).getRealmRoles().size() == 8); - assertTrue(keyCloakUsersResult.get(0).getRealmRoles().get(0).equals("elogbook-superuser")); - assertTrue(keyCloakUsersResult.get(0).getRealmRoles().get(6).equals("elogbook-access")); + assertEquals(1, keyCloakUsersResult.size()); + assertEquals(18, keyCloakUsersResult.get(0).getAllRoles().size()); + assertEquals("feedin-management-access", keyCloakUsersResult.get(0).getAllRoles().get(0)); + assertEquals("testclientrole", keyCloakUsersResult.get(0).getAllRoles().get(17)); } @Test public void testGetKeyCloakUsers_EmptyToken() throws Exception { + PowerMock.mockStatic(JwtHelper.class); List<KeyCloakUser> compList = new ArrayList<>(); UserCache.getInstance().setKeyCloakUsers(compList); @@ -97,6 +99,7 @@ @Test public void testGetKeyCloakUsers_null() throws Exception { + PowerMock.mockStatic(JwtHelper.class); List<KeyCloakUser> compList = new ArrayList<>(); UserCache.getInstance().setKeyCloakUsers(compList); @@ -116,6 +119,7 @@ @Test public void testGetKeyCloakUsersFromToken_ListEmpty() throws Exception { + PowerMock.mockStatic(JwtHelper.class); String jsonKeyCloakUser = super.loadStringFromResource("testKeyCloakUsers.json"); Type listTypeKeyCloakUser = new TypeToken<List<KeyCloakUser>>(){}.getType(); List<KeyCloakUser> keyCloakUsersListOrg = JsonGeneratorBase.getGson().fromJson(jsonKeyCloakUser, listTypeKeyCloakUser);
diff --git a/src/test/java/org/eclipse/openk/portal/util/JwtHelperTest.java b/src/test/java/org/eclipse/openk/portal/util/JwtHelperTest.java index 0b47db0..f04b751 100644 --- a/src/test/java/org/eclipse/openk/portal/util/JwtHelperTest.java +++ b/src/test/java/org/eclipse/openk/portal/util/JwtHelperTest.java
@@ -13,12 +13,19 @@ import org.eclipse.openk.portal.auth2.model.JwtPayload; import org.eclipse.openk.portal.auth2.model.JwtToken; +import org.eclipse.openk.portal.auth2.model.KeyCloakRole; import org.eclipse.openk.portal.auth2.util.JwtHelper; +import org.eclipse.openk.portal.common.util.ResourceLoaderBase; +import org.eclipse.openk.portal.exceptions.PortalInternalServerError; import org.junit.Test; +import java.util.List; + +import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertTrue; import static org.junit.Assert.assertNotNull; -public class JwtHelperTest { +public class JwtHelperTest extends ResourceLoaderBase { @Test public void testGetJwtPayload_Base64URL() { @@ -59,4 +66,42 @@ assertNotNull( pl ); } + + @Test + public void testGetRolesListFromJson_testKeyCloakRoles_noClientRoleAtAll() throws PortalInternalServerError { + String jsonKeyCloakRoles = super.loadStringFromResource("testKeyCloakRoles_noClientRoleAtAll.json"); + List<KeyCloakRole> keyCloakRolesList = JwtHelper.getRolesListFromJson(jsonKeyCloakRoles); + + assertEquals("elogbook-access", keyCloakRolesList.get(0).getName()); + assertEquals(2, keyCloakRolesList.size()); + } + + @Test + public void testGetRolesListFromJson_testKeyCloakRoles_noClientRoleForClient() throws PortalInternalServerError { + String jsonKeyCloakRoles = super.loadStringFromResource("testKeyCloakRoles_noClientRoleForClient.json"); + List<KeyCloakRole> keyCloakRolesList = JwtHelper.getRolesListFromJson(jsonKeyCloakRoles); + + assertEquals("elogbook-access", keyCloakRolesList.get(0).getName()); + assertEquals(2, keyCloakRolesList.size()); + } + + @Test + public void testGetRolesListFromJson_testKeyCloakRoles_noRealmRole() throws PortalInternalServerError { + String jsonKeyCloakRoles = super.loadStringFromResource("testKeyCloakRoles_noRealmRole.json"); + List<KeyCloakRole> keyCloakRolesList = JwtHelper.getRolesListFromJson(jsonKeyCloakRoles); + + assertTrue(keyCloakRolesList.isEmpty()); + } + + @Test + public void testGetRolesListFromJson_testKeyCloakRoles_onlyRealmRole() throws PortalInternalServerError { + String jsonKeyCloakRoles = super.loadStringFromResource("testKeyCloakRoles_onlyRealmRole.json"); + List<KeyCloakRole> keyCloakRolesList = JwtHelper.getRolesListFromJson(jsonKeyCloakRoles); + + assertEquals("view-profile", keyCloakRolesList.get(0).getName()); + assertTrue(keyCloakRolesList.get(0).getClientRole()); + assertEquals(2, keyCloakRolesList.size()); + } + + }
diff --git a/src/test/resources/testKeyCloakClientAndRealmRoles.json b/src/test/resources/testKeyCloakClientAndRealmRoles.json new file mode 100644 index 0000000..a39cb11 --- /dev/null +++ b/src/test/resources/testKeyCloakClientAndRealmRoles.json
@@ -0,0 +1,159 @@ +{ + "realmMappings": [ + { + "id": "7a145be5-20ba-4992-ad54-17c28d0bc0f9", + "name": "feedin-management-access", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "37d42cc3-0157-4ab6-b9fe-8be50de37da8", + "name": "planned-policies-executor", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "b1cf034b-bce3-4d29-9e9d-692bf420ce83", + "name": "planned-policies-access", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "baf44fc2-7888-4888-beaa-79288e9268a0", + "name": "planning-access", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "a1760267-b72d-4cef-bb2a-91c0d4a24cd7", + "name": "planned-policies-measureplanner", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "f41f6144-f788-434d-be7a-ee3190099f5d", + "name": "planned-policies-superuser", + "scopeParamRequired": false, + "composite": true, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "f8fa3a84-b7d8-4ad7-98c5-3c77ca6c1a33", + "name": "kon_admin", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "1e41d089-72ea-4b22-a88c-56037b9680d8", + "name": "planned-policies-measureapplicant", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "e423626e-4616-45b7-9c3d-10a7f0acab8c", + "name": "elogbook-superuser", + "description": "", + "scopeParamRequired": false, + "composite": true, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "69cd9f7d-bd7b-473d-9ae2-8ca8665fa9bf", + "name": "planned-policies-requester", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "7533b166-79da-44f6-bb84-fe6a3916c9cd", + "name": "planned-policies-measureapprover", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "dc84c3f4-2509-4894-9b91-772b67d1d470", + "name": "planned-policies-completion", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "061827bc-771d-4ce1-9123-3d211686c078", + "name": "planned-policies-normaluser", + "description": "Darf vieles, aber nicht alles", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "27b9578f-416b-4f67-8259-60464636f457", + "name": "planned-policies-clearance", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "7b977153-1107-4a7d-b2b3-dc6daa461c15", + "name": "kon-access", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "384e7a68-8e70-41aa-bbbd-1a0ffb293335", + "name": "elogbook-access", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "6b8d2da8-220c-4f83-8e15-889004e66359", + "name": "elogbook-normaluser", + "description": "Darf vieles, aber nicht alles", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + } + ], + "clientMappings": { + "elogbook-backend": { + "id": "e9904530-1ced-4d6b-96dc-fd1f3ce6420c", + "client": "elogbook-backend", + "mappings": [ + { + "id": "f9971606-b587-41d0-a903-4e97b103e3b2", + "name": "testclientrole", + "scopeParamRequired": false, + "composite": false, + "clientRole": true, + "containerId": "e9904530-1ced-4d6b-96dc-fd1f3ce6420c" + } + ] + } + } +} \ No newline at end of file
diff --git a/src/test/resources/testKeyCloakRoles_noClientRoleAtAll.json b/src/test/resources/testKeyCloakRoles_noClientRoleAtAll.json new file mode 100644 index 0000000..760a6a1 --- /dev/null +++ b/src/test/resources/testKeyCloakRoles_noClientRoleAtAll.json
@@ -0,0 +1,21 @@ +{ + "realmMappings": [ + { + "id": "384e7a68-8e70-41aa-bbbd-1a0ffb293335", + "name": "elogbook-access", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "6b8d2da8-220c-4f83-8e15-889004e66359", + "name": "elogbook-normaluser", + "description": "Darf vieles, aber nicht alles", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + } + ] +} \ No newline at end of file
diff --git a/src/test/resources/testKeyCloakRoles_noClientRoleForClient.json b/src/test/resources/testKeyCloakRoles_noClientRoleForClient.json new file mode 100644 index 0000000..d11bef0 --- /dev/null +++ b/src/test/resources/testKeyCloakRoles_noClientRoleForClient.json
@@ -0,0 +1,47 @@ +{ + "realmMappings": [ + { + "id": "384e7a68-8e70-41aa-bbbd-1a0ffb293335", + "name": "elogbook-access", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + }, + { + "id": "6b8d2da8-220c-4f83-8e15-889004e66359", + "name": "elogbook-normaluser", + "description": "Darf vieles, aber nicht alles", + "scopeParamRequired": false, + "composite": false, + "clientRole": false, + "containerId": "elogbook" + } + ], + "clientMappings": { + "account": { + "id": "ab5b5dd0-e943-4cef-bb86-5f17031ca6ed", + "client": "account", + "mappings": [ + { + "id": "bfcf9034-7921-4200-ad2a-bf3f9c0d3f38", + "name": "view-profile", + "description": "${role_view-profile}", + "scopeParamRequired": false, + "composite": false, + "clientRole": true, + "containerId": "ab5b5dd0-e943-4cef-bb86-5f17031ca6ed" + }, + { + "id": "0706bea7-d53b-4075-a4ab-d0b175cd660f", + "name": "manage-account", + "description": "${role_manage-account}", + "scopeParamRequired": false, + "composite": true, + "clientRole": true, + "containerId": "ab5b5dd0-e943-4cef-bb86-5f17031ca6ed" + } + ] + } + } +} \ No newline at end of file
diff --git a/src/test/resources/testKeyCloakRoles_noRealmRole.json b/src/test/resources/testKeyCloakRoles_noRealmRole.json new file mode 100644 index 0000000..66470b2 --- /dev/null +++ b/src/test/resources/testKeyCloakRoles_noRealmRole.json
@@ -0,0 +1,28 @@ +{ + "clientMappings": { + "account": { + "id": "ab5b5dd0-e943-4cef-bb86-5f17031ca6ed", + "client": "account", + "mappings": [ + { + "id": "bfcf9034-7921-4200-ad2a-bf3f9c0d3f38", + "name": "view-profile", + "description": "${role_view-profile}", + "scopeParamRequired": false, + "composite": false, + "clientRole": true, + "containerId": "ab5b5dd0-e943-4cef-bb86-5f17031ca6ed" + }, + { + "id": "0706bea7-d53b-4075-a4ab-d0b175cd660f", + "name": "manage-account", + "description": "${role_manage-account}", + "scopeParamRequired": false, + "composite": true, + "clientRole": true, + "containerId": "ab5b5dd0-e943-4cef-bb86-5f17031ca6ed" + } + ] + } + } +} \ No newline at end of file
diff --git a/src/test/resources/testKeyCloakRoles_onlyRealmRole.json b/src/test/resources/testKeyCloakRoles_onlyRealmRole.json new file mode 100644 index 0000000..24aff34 --- /dev/null +++ b/src/test/resources/testKeyCloakRoles_onlyRealmRole.json
@@ -0,0 +1,28 @@ +{ + "clientMappings": { + "elogbook-backend": { + "id": "ab5b5dd0-e943-4cef-bb86-5f17031ca6ed", + "client": "elogbook-backend", + "mappings": [ + { + "id": "bfcf9034-7921-4200-ad2a-bf3f9c0d3f38", + "name": "view-profile", + "description": "${role_view-profile}", + "scopeParamRequired": false, + "composite": false, + "clientRole": true, + "containerId": "ab5b5dd0-e943-4cef-bb86-5f17031ca6ed" + }, + { + "id": "0706bea7-d53b-4075-a4ab-d0b175cd660f", + "name": "manage-account", + "description": "${role_manage-account}", + "scopeParamRequired": false, + "composite": true, + "clientRole": true, + "containerId": "ab5b5dd0-e943-4cef-bb86-5f17031ca6ed" + } + ] + } + } +} \ No newline at end of file