keycloak-uncached

[KEYCLOAK-8768] - Policy evaluation tool failing when client

11/8/2018 7:33:47 PM

Details

diff --git a/services/src/main/java/org/keycloak/authorization/admin/PolicyEvaluationService.java b/services/src/main/java/org/keycloak/authorization/admin/PolicyEvaluationService.java
index 2296f93..46203d6 100644
--- a/services/src/main/java/org/keycloak/authorization/admin/PolicyEvaluationService.java
+++ b/services/src/main/java/org/keycloak/authorization/admin/PolicyEvaluationService.java
@@ -209,6 +209,25 @@ public class PolicyEvaluationService {
             }
 
         }
+
+        @Override
+        public String getId() {
+            if (userSession != null) {
+                return super.getId();
+            }
+
+            String issuedFor = accessToken.getIssuedFor();
+
+            if (issuedFor != null) {
+                UserModel serviceAccount = keycloakSession.users().getServiceAccount(realm.getClientByClientId(issuedFor));
+
+                if (serviceAccount != null) {
+                    return serviceAccount.getId();
+                }
+            }
+
+            return null;
+        }
     }
 
     private CloseableKeycloakIdentity createIdentity(PolicyEvaluationRequest representation) {
@@ -251,7 +270,19 @@ public class PolicyEvaluationService {
             accessToken = new AccessToken();
 
             accessToken.subject(representation.getUserId());
-            accessToken.issuedFor(representation.getClientId());
+            ClientModel client = null;
+            String clientId = representation.getClientId();
+
+            if (clientId != null) {
+                client = realm.getClientById(clientId);
+            }
+
+            if (client == null) {
+                client = realm.getClientById(resourceServer.getId());
+            }
+
+            accessToken.issuedFor(client.getClientId());
+            accessToken.audience(client.getId());
             accessToken.issuer(Urls.realmIssuer(keycloakSession.getContext().getUri().getBaseUri(), realm.getName()));
             accessToken.setRealmAccess(new AccessToken.Access());