From 316053018b7147d1733f5d18625c6e4a6e777971 Mon Sep 17 00:00:00 2001 From: mposolda Date: Mon, 27 Apr 2015 20:48:33 +0200 Subject: [PATCH] KEYCLOAK-1070 Support for view and revoke consents in admin console --- .../idm/UserConsentRepresentation.java | 40 ++++++++-- .../idm/UserRepresentation.java | 6 +- .../exportimport/util/ExportUtils.java | 24 +----- .../theme/base/admin/resources/js/app.js | 24 ++++++ .../admin/resources/js/controllers/users.js | 18 +++++ .../theme/base/admin/resources/js/loaders.js | 8 ++ .../theme/base/admin/resources/js/services.js | 7 ++ .../resources/partials/role-mappings.html | 8 +- .../resources/partials/user-consents.html | 47 +++++++++++ .../resources/partials/user-credentials.html | 9 +-- .../admin/resources/partials/user-detail.html | 9 +-- .../partials/user-federated-identity.html | 8 +- .../resources/partials/user-sessions.html | 8 +- .../templates/kc-navigation-user.html | 8 ++ .../models/utils/ModelToRepresentation.java | 43 ++++++++++ .../models/utils/RepresentationToModel.java | 78 ++++++++++++------- .../resources/admin/UsersResource.java | 52 +++++++++++++ .../src/test/resources/model/testrealm.json | 24 +++--- 18 files changed, 315 insertions(+), 106 deletions(-) create mode 100644 forms/common-themes/src/main/resources/theme/base/admin/resources/partials/user-consents.html create mode 100644 forms/common-themes/src/main/resources/theme/base/admin/resources/templates/kc-navigation-user.html diff --git a/core/src/main/java/org/keycloak/representations/idm/UserConsentRepresentation.java b/core/src/main/java/org/keycloak/representations/idm/UserConsentRepresentation.java index 113ba8483c6d..93dbd73b4c79 100644 --- a/core/src/main/java/org/keycloak/representations/idm/UserConsentRepresentation.java +++ b/core/src/main/java/org/keycloak/representations/idm/UserConsentRepresentation.java @@ -1,28 +1,52 @@ package org.keycloak.representations.idm; import java.util.List; +import java.util.Map; /** * @author Marek Posolda */ public class UserConsentRepresentation { - protected List grantedRoles; // points to roleIds - protected List grantedProtocolMappers; // points to protocolMapperIds + protected String clientId; - public List getGrantedRoles() { - return grantedRoles; + // Key is protocol, Value is list of granted consents for this protocol + protected Map> grantedProtocolMappers; + + protected List grantedRealmRoles; + + // Key is clientId, Value is list of granted roles of this client + protected Map> grantedClientRoles; + + public String getClientId() { + return clientId; } - public void setGrantedRoles(List grantedRoles) { - this.grantedRoles = grantedRoles; + public void setClientId(String clientId) { + this.clientId = clientId; } - public List getGrantedProtocolMappers() { + public Map> getGrantedProtocolMappers() { return grantedProtocolMappers; } - public void setGrantedProtocolMappers(List grantedProtocolMappers) { + public void setGrantedProtocolMappers(Map> grantedProtocolMappers) { this.grantedProtocolMappers = grantedProtocolMappers; } + + public List getGrantedRealmRoles() { + return grantedRealmRoles; + } + + public void setGrantedRealmRoles(List grantedRealmRoles) { + this.grantedRealmRoles = grantedRealmRoles; + } + + public Map> getGrantedClientRoles() { + return grantedClientRoles; + } + + public void setGrantedClientRoles(Map> grantedClientRoles) { + this.grantedClientRoles = grantedClientRoles; + } } diff --git a/core/src/main/java/org/keycloak/representations/idm/UserRepresentation.java b/core/src/main/java/org/keycloak/representations/idm/UserRepresentation.java index b9716d31500b..747b64cc0b3c 100755 --- a/core/src/main/java/org/keycloak/representations/idm/UserRepresentation.java +++ b/core/src/main/java/org/keycloak/representations/idm/UserRepresentation.java @@ -27,7 +27,7 @@ public class UserRepresentation { protected List federatedIdentities; protected List realmRoles; protected Map> clientRoles; - protected Map clientConsents; + protected List clientConsents; @Deprecated protected Map> applicationRoles; @@ -177,11 +177,11 @@ public void setClientRoles(Map> clientRoles) { this.clientRoles = clientRoles; } - public Map getClientConsents() { + public List getClientConsents() { return clientConsents; } - public void setClientConsents(Map clientConsents) { + public void setClientConsents(List clientConsents) { this.clientConsents = clientConsents; } diff --git a/export-import/export-import-api/src/main/java/org/keycloak/exportimport/util/ExportUtils.java b/export-import/export-import-api/src/main/java/org/keycloak/exportimport/util/ExportUtils.java index bccce2d0ffeb..8165471c3ea5 100755 --- a/export-import/export-import-api/src/main/java/org/keycloak/exportimport/util/ExportUtils.java +++ b/export-import/export-import-api/src/main/java/org/keycloak/exportimport/util/ExportUtils.java @@ -287,29 +287,11 @@ public static UserRepresentation exportUser(KeycloakSession session, RealmModel // Grants List consents = user.getConsents(); - Map consentReps = new HashMap(); + LinkedList consentReps = new LinkedList(); for (UserConsentModel consent : consents) { - String clientId = consent.getClient().getClientId(); - - List grantedProtocolMappers = new LinkedList(); - for (ProtocolMapperModel protocolMapper : consent.getGrantedProtocolMappers()) { - grantedProtocolMappers.add(protocolMapper.getId()); - } - - List grantedRoles = new LinkedList(); - for (RoleModel role : consent.getGrantedRoles()) { - grantedRoles.add(role.getId()); - } - - - if (grantedRoles.size() > 0 || grantedProtocolMappers.size() > 0) { - UserConsentRepresentation consentRep = new UserConsentRepresentation(); - if (grantedRoles.size() > 0) consentRep.setGrantedRoles(grantedRoles); - if (grantedProtocolMappers.size() > 0) consentRep.setGrantedProtocolMappers(grantedProtocolMappers); - consentReps.put(clientId, consentRep); - } + UserConsentRepresentation consentRep = ModelToRepresentation.toRepresentation(consent); + consentReps.add(consentRep); } - if (consentReps.size() > 0) { userRep.setClientConsents(consentReps); } diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js index e69671403207..52de4a07515d 100755 --- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js @@ -399,6 +399,21 @@ module.config([ '$routeProvider', function($routeProvider) { }, controller : 'UserFederatedIdentityCtrl' }) + .when('/realms/:realm/users/:user/consents', { + templateUrl : resourceUrl + '/partials/user-consents.html', + resolve : { + realm : function(RealmLoader) { + return RealmLoader(); + }, + user : function(UserLoader) { + return UserLoader(); + }, + userConsents : function(UserConsentsLoader) { + return UserConsentsLoader(); + } + }, + controller : 'UserConsentsCtrl' + }) .when('/realms/:realm/users', { templateUrl : resourceUrl + '/partials/user-list.html', resolve : { @@ -1418,6 +1433,15 @@ module.directive('kcNavigationClient', function () { } }); +module.directive('kcNavigationUser', function () { + return { + scope: true, + restrict: 'E', + replace: true, + templateUrl: resourceUrl + '/templates/kc-navigation-user.html' + } +}); + /* * Used to select the element (invoke $(elem).select()) on specified action list. * Usages kc-select-action="click mouseover" diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/users.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/users.js index 17fbb16f6ce3..efc33b8556fb 100755 --- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/users.js +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/users.js @@ -135,6 +135,24 @@ module.controller('UserFederatedIdentityCtrl', function($scope, realm, user, fed $scope.federatedIdentities = federatedIdentities; }); +module.controller('UserConsentsCtrl', function($scope, realm, user, userConsents, UserConsents, Notifications) { + $scope.realm = realm; + $scope.user = user; + $scope.userConsents = userConsents; + + $scope.revokeConsent = function(clientId) { + UserConsents.delete({realm : realm.realm, user: user.username, client: clientId }, function () { + UserConsents.query({realm: realm.realm, user: user.username}, function(updated) { + $scope.userConsents = updated; + }) + Notifications.success('Consent revoked successfully'); + }, function() { + Notifications.error("Consent couldn't be revoked"); + }); + console.log("Revoke consent " + clientId); + } +}); + module.controller('UserListCtrl', function($scope, realm, User) { $scope.realm = realm; diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/loaders.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/loaders.js index bf36307301c3..3f72ffe049a2 100755 --- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/loaders.js +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/loaders.js @@ -144,6 +144,14 @@ module.factory('UserFederatedIdentityLoader', function(Loader, UserFederatedIden }); }); +module.factory('UserConsentsLoader', function(Loader, UserConsents, $route, $q) { + return Loader.query(UserConsents, function() { + return { + realm : $route.current.params.realm, + user : $route.current.params.user + } + }); +}); diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/services.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/services.js index ce209a6d5f7d..7708821a4756 100755 --- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/services.js +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/services.js @@ -268,6 +268,13 @@ module.factory('UserFederatedIdentity', function($resource) { user : '@user' }); }); +module.factory('UserConsents', function($resource) { + return $resource(authUrl + '/admin/realms/:realm/users/:user/consents/:client', { + realm : '@realm', + user : '@user', + client: '@client' + }); +}); module.factory('UserCredentials', function($resource) { var credentials = {}; diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/role-mappings.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/role-mappings.html index 314212bd29ad..0cb3c9c43e63 100755 --- a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/role-mappings.html +++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/role-mappings.html @@ -1,12 +1,6 @@
- +