keycloak-memoizeit

merge

8/16/2013 9:14:37 AM

Details

diff --git a/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java b/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java
index 8ef7c4a..e365a61 100755
--- a/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java
+++ b/core/src/main/java/org/keycloak/representations/idm/RealmRepresentation.java
@@ -22,6 +22,7 @@ public class RealmRepresentation {
     protected String privateKey;
     protected String publicKey;
     protected List<RoleRepresentation> roles;
+    protected String[] defaultRoles;
     protected Set<String> requiredCredentials;
     protected Set<String> requiredApplicationCredentials;
     protected Set<String> requiredOAuthClientCredentials;
@@ -183,6 +184,14 @@ public class RealmRepresentation {
         this.roles = roles;
     }
 
+    public String[] getDefaultRoles() {
+        return defaultRoles;
+    }
+
+    public void setDefaultRoles(String[] defaultRoles) {
+        this.defaultRoles = defaultRoles;
+    }
+
     public String getPrivateKey() {
         return privateKey;
     }
diff --git a/examples/as7-eap-demo/server/src/main/java/org/keycloak/example/demo/DemoApplication.java b/examples/as7-eap-demo/server/src/main/java/org/keycloak/example/demo/DemoApplication.java
index faf899e..2904505 100755
--- a/examples/as7-eap-demo/server/src/main/java/org/keycloak/example/demo/DemoApplication.java
+++ b/examples/as7-eap-demo/server/src/main/java/org/keycloak/example/demo/DemoApplication.java
@@ -43,6 +43,7 @@ public class DemoApplication extends KeycloakApplication {
         manager.generateRealmKeys(defaultRealm);
         defaultRealm.addRequiredCredential(CredentialRepresentation.PASSWORD);
         defaultRealm.addRole(SaasService.REALM_CREATOR_ROLE);
+        defaultRealm.addDefaultRole(SaasService.REALM_CREATOR_ROLE);
 
         RealmRepresentation rep = loadJson("META-INF/testrealm.json");
         RealmModel realm = manager.createRealm("demo", rep.getRealm());
diff --git a/examples/as7-eap-demo/server/src/main/resources/META-INF/testrealm.json b/examples/as7-eap-demo/server/src/main/resources/META-INF/testrealm.json
index 2a711d0..f92e34c 100755
--- a/examples/as7-eap-demo/server/src/main/resources/META-INF/testrealm.json
+++ b/examples/as7-eap-demo/server/src/main/resources/META-INF/testrealm.json
@@ -11,6 +11,7 @@
     "requiredCredentials": [ "password" ],
     "requiredApplicationCredentials": [ "password" ],
     "requiredOAuthClientCredentials": [ "password" ],
+    "defaultRoles": [ "user" ],
     "users" : [
         {
             "username" : "bburke@redhat.com",
diff --git a/services/src/main/java/org/keycloak/services/managers/RealmManager.java b/services/src/main/java/org/keycloak/services/managers/RealmManager.java
index 029eb8b..4767558 100755
--- a/services/src/main/java/org/keycloak/services/managers/RealmManager.java
+++ b/services/src/main/java/org/keycloak/services/managers/RealmManager.java
@@ -2,7 +2,6 @@ package org.keycloak.services.managers;
 
 import org.jboss.resteasy.logging.Logger;
 import org.keycloak.representations.idm.*;
-import org.keycloak.representations.idm.ApplicationRepresentation;
 import org.keycloak.services.models.*;
 
 import java.security.KeyPair;
@@ -84,6 +83,9 @@ public class RealmManager {
         if (rep.getRequiredApplicationCredentials() != null) {
             realm.updateRequiredApplicationCredentials(rep.getRequiredApplicationCredentials());
         }
+        if (rep.getDefaultRoles() != null) {
+            realm.updateDefaultRoles(rep.getDefaultRoles());
+        }
     }
 
     public RealmModel importRealm(RealmRepresentation rep, UserModel realmCreator) {
@@ -131,11 +133,9 @@ public class RealmManager {
             }
         }
 
-
-        UserManager userManager = new UserManager();
         if (rep.getUsers() != null) {
             for (UserRepresentation userRep : rep.getUsers()) {
-                UserModel user = userManager.createUser(newRealm, userRep);
+                UserModel user = createUser(newRealm, userRep);
                 userMap.put(user.getLoginName(), user);
             }
         }
@@ -146,6 +146,12 @@ public class RealmManager {
             }
         }
 
+        if (rep.getDefaultRoles() != null) {
+            for (String roleString : rep.getDefaultRoles()) {
+                newRealm.addDefaultRole(roleString.trim());
+            }
+        }
+
         if (rep.getApplications() != null) {
             createResources(rep, newRealm);
         }
@@ -183,6 +189,24 @@ public class RealmManager {
         if (roleRep.getDescription() != null) role.setDescription(roleRep.getDescription());
     }
 
+    public UserModel createUser(RealmModel newRealm, UserRepresentation userRep) {
+        UserModel user = newRealm.addUser(userRep.getUsername());
+        user.setEnabled(userRep.isEnabled());
+        if (userRep.getAttributes() != null) {
+            for (Map.Entry<String, String> entry : userRep.getAttributes().entrySet()) {
+                user.setAttribute(entry.getKey(), entry.getValue());
+            }
+        }
+        if (userRep.getCredentials() != null) {
+            for (CredentialRepresentation cred : userRep.getCredentials()) {
+                UserCredentialModel credential = new UserCredentialModel();
+                credential.setType(cred.getType());
+                credential.setValue(cred.getValue());
+                newRealm.updateCredential(user, credential);
+            }
+        }
+        return user;
+    }
 
     public void addRequiredCredential(RealmModel newRealm, String requiredCred) {
         newRealm.addRequiredCredential(requiredCred);
diff --git a/services/src/main/java/org/keycloak/services/models/jpa/entities/RealmEntity.java b/services/src/main/java/org/keycloak/services/models/jpa/entities/RealmEntity.java
index 7f6c5ee..bb55046 100755
--- a/services/src/main/java/org/keycloak/services/models/jpa/entities/RealmEntity.java
+++ b/services/src/main/java/org/keycloak/services/models/jpa/entities/RealmEntity.java
@@ -29,6 +29,7 @@ public class RealmEntity {
     protected String publicKeyPem;
     @Column(length = 2048)
     protected String privateKeyPem;
+    protected String[] defaultRoles;
 
     @OneToMany(cascade ={CascadeType.REMOVE}, orphanRemoval = true)
     Collection<RequiredCredentailEntity> requiredCredentials;
diff --git a/services/src/main/java/org/keycloak/services/models/picketlink/mappings/RealmData.java b/services/src/main/java/org/keycloak/services/models/picketlink/mappings/RealmData.java
index 0dc72b9..1fc6b7f 100755
--- a/services/src/main/java/org/keycloak/services/models/picketlink/mappings/RealmData.java
+++ b/services/src/main/java/org/keycloak/services/models/picketlink/mappings/RealmData.java
@@ -19,6 +19,7 @@ public class RealmData extends AbstractPartition {
     private int accessCodeLifespan;
     private String publicKeyPem;
     private String privateKeyPem;
+    private String[] defaultRoles;
 
     public RealmData() {
         super(null);
@@ -116,4 +117,13 @@ public class RealmData extends AbstractPartition {
     public void setPrivateKeyPem(String privateKeyPem) {
         this.privateKeyPem = privateKeyPem;
     }
+
+    @AttributeProperty
+    public String[] getDefaultRoles() {
+        return defaultRoles;
+    }
+
+    public void setDefaultRoles(String[] defaultRoles) {
+        this.defaultRoles = defaultRoles;
+    }
 }
diff --git a/services/src/main/java/org/keycloak/services/models/picketlink/mappings/RealmEntity.java b/services/src/main/java/org/keycloak/services/models/picketlink/mappings/RealmEntity.java
index e4b83c4..e7e0883 100755
--- a/services/src/main/java/org/keycloak/services/models/picketlink/mappings/RealmEntity.java
+++ b/services/src/main/java/org/keycloak/services/models/picketlink/mappings/RealmEntity.java
@@ -46,6 +46,8 @@ public class RealmEntity implements Serializable {
     @AttributeValue
     @Column(length = 2048)
     private String privateKeyPem;
+    @AttributeValue
+    private String[] defaultRoles;
 
 
     public PartitionTypeEntity getPartitionTypeEntity() {
diff --git a/services/src/main/java/org/keycloak/services/models/picketlink/RealmAdapter.java b/services/src/main/java/org/keycloak/services/models/picketlink/RealmAdapter.java
index 4e014ff..e12e54e 100755
--- a/services/src/main/java/org/keycloak/services/models/picketlink/RealmAdapter.java
+++ b/services/src/main/java/org/keycloak/services/models/picketlink/RealmAdapter.java
@@ -41,6 +41,7 @@ import java.security.PrivateKey;
 import java.security.PublicKey;
 import java.security.cert.X509Certificate;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -665,4 +666,48 @@ public class RealmAdapter implements RealmModel {
         relationship.setRealm(realm.getName());
         getRelationshipManager().add(relationship);
     }
+
+    @Override
+    public List<RoleModel> getDefaultRoles() {
+        List<RoleModel> defaultRoleModels = new ArrayList<RoleModel>();
+        if (realm.getDefaultRoles() != null) {
+            for (String name : realm.getDefaultRoles()) {
+                RoleAdapter role = getRole(name);
+                if (role != null) {
+                    defaultRoleModels.add(role);
+                }
+            }
+        }
+        return defaultRoleModels;
+    }
+
+    @Override
+    public void addDefaultRole(String name) {
+        if (getRole(name) == null) {
+            addRole(name);
+        }
+
+        String[] defaultRoles = realm.getDefaultRoles();
+        if (defaultRoles == null) {
+            defaultRoles = new String[1];
+        } else {
+            defaultRoles = Arrays.copyOf(defaultRoles, defaultRoles.length + 1);
+        }
+        defaultRoles[defaultRoles.length - 1] = name;
+
+        realm.setDefaultRoles(defaultRoles);
+        updateRealm();
+    }
+
+    @Override
+    public void updateDefaultRoles(String[] defaultRoles) {
+        for (String name : defaultRoles) {
+            if (getRole(name) == null) {
+                addRole(name);
+            }
+        }
+
+        realm.setDefaultRoles(defaultRoles);
+        updateRealm();
+    }
 }
diff --git a/services/src/main/java/org/keycloak/services/models/RealmModel.java b/services/src/main/java/org/keycloak/services/models/RealmModel.java
index 1d7b3fd..b954708 100755
--- a/services/src/main/java/org/keycloak/services/models/RealmModel.java
+++ b/services/src/main/java/org/keycloak/services/models/RealmModel.java
@@ -78,6 +78,12 @@ public interface RealmModel {
     RoleModel addRole(String name);
 
     List<RoleModel> getRoles();
+    
+    List<RoleModel> getDefaultRoles();
+    
+    void addDefaultRole(String name);
+    
+    void updateDefaultRoles(String[] defaultRoles);
 
     Map<String, ApplicationModel> getResourceNameMap();
 
diff --git a/services/src/main/java/org/keycloak/services/resources/SaasService.java b/services/src/main/java/org/keycloak/services/resources/SaasService.java
index e969d7e..ea786cc 100755
--- a/services/src/main/java/org/keycloak/services/resources/SaasService.java
+++ b/services/src/main/java/org/keycloak/services/resources/SaasService.java
@@ -376,8 +376,11 @@ public class SaasService {
             credModel.setValue(cred.getValue());
             defaultRealm.updateCredential(user, credModel);
         }
-        RoleModel realmCreator = defaultRealm.getRole(REALM_CREATOR_ROLE);
-        defaultRealm.grantRole(user, realmCreator);
+
+        for (RoleModel role : defaultRealm.getDefaultRoles()) {
+            defaultRealm.grantRole(user, role);
+        }
+
         return user;
     }
 
diff --git a/services/src/main/java/org/keycloak/services/resources/SocialResource.java b/services/src/main/java/org/keycloak/services/resources/SocialResource.java
index 35d625a..73e139c 100644
--- a/services/src/main/java/org/keycloak/services/resources/SocialResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/SocialResource.java
@@ -144,13 +144,16 @@ public class SocialResource {
                 UserModel user = realm.getUser(provider.getId() + "." + socialUser.getId());
 
                 if (user == null) {
+                    if (!realm.isRegistrationAllowed()) {
+                        return oauth.forwardToSecurityFailure("Registration not allowed");
+                    }
+
                     user = realm.addUser(provider.getId() + "." + socialUser.getId());
                     user.setAttribute(provider.getId() + ".id", socialUser.getId());
 
-                    // TODO Grant default roles for realm when available
-                    RoleModel defaultRole = realm.getRole("user");
-
-                    realm.grantRole(user, defaultRole);
+                    for (RoleModel role : realm.getDefaultRoles()) {
+                        realm.grantRole(user, role);
+                    }
                 }
 
                 if (!user.isEnabled()) {
diff --git a/services/src/main/java/org/keycloak/services/resources/TokenService.java b/services/src/main/java/org/keycloak/services/resources/TokenService.java
index 7488fe1..8c28310 100755
--- a/services/src/main/java/org/keycloak/services/resources/TokenService.java
+++ b/services/src/main/java/org/keycloak/services/resources/TokenService.java
@@ -296,10 +296,9 @@ public class TokenService {
                 credentials.setValue(formData.getFirst("password"));
                 realm.updateCredential(user, credentials);
 
-                // TODO Grant default roles for realm when available
-                RoleModel defaultRole = realm.getRole("user");
-                
-                realm.grantRole(user, defaultRole);
+                for (RoleModel role : realm.getDefaultRoles()) {
+                    realm.grantRole(user, role);
+                }
 
                 return processLogin(clientId, scopeParam, state, redirect, formData);
             }
diff --git a/services/src/test/java/org/keycloak/test/AdapterTest.java b/services/src/test/java/org/keycloak/test/AdapterTest.java
index ad191dd..2012264 100755
--- a/services/src/test/java/org/keycloak/test/AdapterTest.java
+++ b/services/src/test/java/org/keycloak/test/AdapterTest.java
@@ -75,6 +75,7 @@ public class AdapterTest {
         realmModel.setPrivateKeyPem("0234234");
         realmModel.setPublicKeyPem("0234234");
         realmModel.setTokenLifespan(1000);
+        realmModel.addDefaultRole("foo");
 
         System.out.println(realmModel.getId());
         realmModel = adapter.getRealm(realmModel.getId());
@@ -85,6 +86,8 @@ public class AdapterTest {
         Assert.assertEquals(realmModel.getName(), "JUGGLER");
         Assert.assertEquals(realmModel.getPrivateKeyPem(), "0234234");
         Assert.assertEquals(realmModel.getPublicKeyPem(), "0234234");
+        Assert.assertEquals(1, realmModel.getDefaultRoles().size());
+        Assert.assertEquals("foo", realmModel.getDefaultRoles().get(0).getName());
     }
 
     @Test
@@ -134,7 +137,7 @@ public class AdapterTest {
         realmModel.addRole("admin");
         realmModel.addRole("user");
         List<RoleModel> roles = realmModel.getRoles();
-        Assert.assertEquals(5, roles.size());
+        Assert.assertEquals(6, roles.size());
         UserModel user = realmModel.addUser("bburke");
         RoleModel role = realmModel.getRole("user");
         realmModel.grantRole(user, role);
diff --git a/services/src/test/java/org/keycloak/test/ImportTest.java b/services/src/test/java/org/keycloak/test/ImportTest.java
index d1534d6..dce085f 100755
--- a/services/src/test/java/org/keycloak/test/ImportTest.java
+++ b/services/src/test/java/org/keycloak/test/ImportTest.java
@@ -72,6 +72,10 @@ public class ImportTest {
         Assert.assertEquals(1, creds.size());
         RequiredCredentialModel cred = creds.get(0);
         Assert.assertEquals("password", cred.getFormLabel());
+        Assert.assertEquals(2, realm.getDefaultRoles().size());
+
+        Assert.assertNotNull(realm.getRole("foo"));
+        Assert.assertNotNull(realm.getRole("bar"));
 
         UserModel user = realm.getUser("loginclient");
         Assert.assertNotNull(user);
diff --git a/services/src/test/java/org/keycloak/test/InstallationManager.java b/services/src/test/java/org/keycloak/test/InstallationManager.java
index 18a2cc4..f18f086 100755
--- a/services/src/test/java/org/keycloak/test/InstallationManager.java
+++ b/services/src/test/java/org/keycloak/test/InstallationManager.java
@@ -24,6 +24,7 @@ public class InstallationManager {
         manager.generateRealmKeys(defaultRealm);
         defaultRealm.addRequiredCredential(CredentialRepresentation.PASSWORD);
         defaultRealm.addRole(SaasService.REALM_CREATOR_ROLE);
+        defaultRealm.addDefaultRole(SaasService.REALM_CREATOR_ROLE);
     }
 
     public boolean isInstalled(RealmManager manager) {
diff --git a/services/src/test/resources/testrealm.json b/services/src/test/resources/testrealm.json
index 6ec29bf..b1e3e39 100755
--- a/services/src/test/resources/testrealm.json
+++ b/services/src/test/resources/testrealm.json
@@ -6,6 +6,7 @@
     "requiredCredentials": [ "password" ],
     "requiredApplicationCredentials": [ "password" ],
     "requiredOAuthClientCredentials": [ "password" ],
+    "defaultRoles": [ "foo", "bar" ],
     "users": [
         {
             "username": "wburke",