2017-10-07 9 views
0

Je suis nouveau sur Realm. Je rencontre des problèmes avec l'autentication de différents utilisateurs sur un serveur de domaine. J'ai écrit quelques lignes de code pour tester les connexions suivantes au serveur et la séparation des domaines.Problème avec l'authentification sur un serveur de domaine - Les configurations ne peuvent pas être différentes si elles sont utilisées pour ouvrir le même fichier

  • je me connecte avec un premier utilisateur [email protected]~~V~~3rd
  • Je POPULATE un RealmObject (UserApp) et je l'enregistrer sur le serveur
  • -je me connecter avec [email protected]
  • Je me connecte avec un deuxième utilisateur [email protected]
  • Je vérifie que UserApp n'est pas renseigné pour cet utilisateur (séparation de domaine)
  • Je me connecte avec [email protected]
  • J'essaie à nouveau de se connecter avec le premier utilisateur [email protected] mais j'obtiens le message d'erreur suivant:

.

*java.lang.IllegalArgumentException: Configurations cannot be different if used to open the same file. 
Cached configuration: 
realmDirectory: /data/user/0/com.my.assistant/files/realm-object-server/621c2e6db5e0cf421741f6e9a428c3dc/621c2e6db5e0cf421741f6e9a428c3dc 
realmFileName : default 
canonicalPath: /data/data/com.my.assistant/files/realm-object-server/621c2e6db5e0cf421741f6e9a428c3dc/621c2e6db5e0cf421741f6e9a428c3dc/default 
key: [length: 0] 
schemaVersion: 0 
migration: null 
deleteRealmIfMigrationNeeded: false 
durability: FULL 
schemaMediator: [email protected] 
readOnly: false 
compactOnLaunch: null 
serverUrl: realm://localhost:9080/621c2e6db5e0cf421741f6e9a428c3dc/default 
user: {UserId: 621c2e6db5e0cf421741f6e9a428c3dc, AuthUrl: http://localhost:9080/auth, IsValid: false, Sessions: 0} 
errorHandler: [email protected] 
deleteRealmOnLogout: false 
waitForInitialRemoteData: false 
New configuration: 
realmDirectory: /data/user/0/com.my.assistant/files/realm-object-server/621c2e6db5e0cf421741f6e9a428c3dc/621c2e6db5e0cf421741f6e9a428c3dc 
realmFileName : default 
canonicalPath: /data/data/com.my.assistant/files/realm-object-server/621c2e6db5e0cf421741f6e9a428c3dc/621c2e6db5e0cf421741f6e9a428c3dc/default 
key: [length: 0] 
schemaVersion: 0 
migration: null 
deleteRealmIfMigrationNeeded: false 
durability: FULL 
schemaMediator: [email protected] 
readOnly: false 
compactOnLaunch: null 
serverUrl: realm://localhost:9080/621c2e6db5e0cf421741f6e9a428c3dc/default 
user: {UserId: 621c2e6db5e0cf421741f6e9a428c3dc, AuthUrl: http://localhost:9080/auth, IsValid: true, Sessions: 0} 
errorHandler: [email protected] 
deleteRealmOnLogout: false 
waitForInitialRemoteData: false 
at io.realm.RealmCache.validateConfiguration(RealmCache.java:461) 
at io.realm.RealmCache.doCreateRealmOrGetFromCache(RealmCache.java:337) 
at io.realm.RealmCache.createRealmOrGetFromCache(RealmCache.java:284) 
at io.realm.Realm.getInstance(Realm.java:301) 
at com.my.assistant.LoginInstrTest2.setConfigurationSyncUser(LoginInstrTest2.java:149) 
at com.my.assistant.LoginInstrTest2.loginUser(LoginInstrTest2.java:129) 
at com.my.assistant.LoginInstrTest2.veryfyRealmUserInstance(LoginInstrTest2.java:98) 
at java.lang.reflect.Method.invoke(Native Method) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runners.Suite.runChild(Suite.java:128) 
at org.junit.runners.Suite.runChild(Suite.java:27) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:115) 
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59) 
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:262) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)* 

Quelqu'un peut-il me dire pourquoi? Mon intention avec ce code est de tester une connexion/déconnexion embryonnaire pour une application Android en utilisant le domaine. L'utilisateur doit se connecter et se déconnecter de l'application en utilisant des informations d'identification différentes. Il me semble qu'il devrait y avoir un moyen d'obtenir la SyncConfiguration précédemment créée pour cet utilisateur au lieu de créer un nouveau ... mais, si c'est le cas, je ne sais pas comment faire ça ....

Ceci est mon code:

// ----------- code principal:

SyncUser userLogged; 

    //Login with first user. This time the login completes successfully 
    userLogged = loginUser("[email protected]", "pluto"); 

    insertUserAppSyncRealm(); 

    RealmResults<UserApp> res = realm.where(UserApp.class) 
      .beginsWith("username", "situs") 
      .findAll(); 
    System.out.println(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Size table pippo " + res.size()); 
    UserApp resUser = res.last(); 
    System.out.println(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ID " + resUser.getId()); 

    userLogged.logout(); 

    //Login with second user OK 
    userLogged = loginUser("[email protected]", "paperino"); 

    RealmResults<UserApp> res2 = realm.where(UserApp.class) 
      .beginsWith("username", "situs") 
      .findAll(); //arrivato qui da "Configurations cannot be different if used to open the same file" 
    System.out.println(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Size table usertest " + res2.size()); 

    userLogged.logout(); 

    //Login again with first user. This time the login fails ("Configurations cannot be different if used to open the same file") 
    userLogged = loginUser("[email protected]", "pluto"); 

    RealmResults<UserApp> res3 = realm.where(UserApp.class) 
      .beginsWith("username", "situs") 
      .findAll(); 
    System.out.println(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Size table pippo " + res3.size()); 

    userLogged.logout(); 

// ----------- utilisé fonctions:

public SyncUser loginUser(String username, String password) { 
    SyncUser userLogged; 
    SyncCredentials myCredentials = SyncCredentials.usernamePassword(username, password, false); 
    userLogged = SyncUser.login(myCredentials, authURL); 
    setConfigurationSyncUser(userLogged); 
    return userLogged; 
} 

public void setConfigurationSyncUser(SyncUser user) { 
    String user1RealmUrl = "realm://localhost:9080/~/default"; 
    SyncConfiguration config = new SyncConfiguration.Builder(user, user1RealmUrl). 
      errorHandler(new SyncSession.ErrorHandler() { 
       public void onError(SyncSession session, ObjectServerError error) { 
        fail("Realm unexpected error: " + error); 
       } 
      }) 
      .build(); 

     realm = Realm.getInstance(config); //fails ("Configurations cannot be different if used to open the same file") 
} 

public void insertUserAppSyncRealm() { 
    UserApp user = new UserApp(); 
    populateUser(user); 
    realm.beginTransaction(); 
    realm.insert(user); 
    realm.commitTransaction(); 
} 

private void populateUser(UserApp user) { 
    user.setUsername("[email protected]"); 
    user.setPassword("12345678"); 
    user.setId(UUID.randomUUID().toString()); 
} 

Merci d'avance pour vos conseils genre ...

Répondre

1

Vous pouvez essayer le code suivant:

public void setConfigurationSyncUser(SyncUser user) { 
    String user1RealmUrl = "realm://localhost:9080/~/default"; 
    class SyncErrorHandler implements SyncSession.ErrorHandler { 
     @Override 
     public void onError(SyncSession session, ObjectServerError error) { 
      fail("Realm unexpected error: " + error); 
     } 

     @Override 
     public int hashCode() { 
      return SyncErrorHandler.class.hashCode(); 
     } 

     @Override 
     public boolean equals(Object obj) { 
      return obj != null && obj instanceof SyncErrorHandler; 
     } 
    }; 
    SyncConfiguration config = new SyncConfiguration.Builder(user, user1RealmUrl). 
      errorHandler(new SyncErrorHandler()) 
      .build(); 

     realm = Realm.getInstance(config); 
} 
+0

Cela devrait fonctionner. Le problème est que votre gestionnaire d'erreur est différent entre les deux configurations: 'com.my.assistant.LoginInstrTest2 $ 1 @ 397b523' vs' com.my.assistant.LoginInstrTest2 $ 1 @ cdafa20' –

+0

Malheureusement, cela n'a pas fonctionné ... I essayez également de supprimer complètement le gestionnaire d'erreur, mais je reçois la même erreur ... une autre idée? – Selvaggia

+0

Avez-vous une nouvelle trace de pile d'exception et des journaux? – EpicPandaForce