2013-10-09 2 views
8

Nous avons une application Java EE 7 et utilisons Arquillian pour tester des choses. Maintenant, nous voulons vérifier certaines autorisations de l'utilisateur actuellement connecté. Ma question est assez simple, comment est-ce que je me connecte à un utilisateur à l'intérieur d'un testcase? J'ai lu ProgrammaticLogin doesnt work in arquillian tests et Embedded Glassfish, security and Arquillian questions mais ils ne sont pas clairement répondu. Mon approche actuelle est quelque chose comme ceci:Comment tester login/authentification avec Arquillian - Java EE 7

// Inject services etc. 

@Test 
public void testLogin(){ 

    UserAccount user = new UserAccount(); 
    user.setUsername("bob"); 
    user.setPassword("bob"); 
    userAccountService.save(user); 

    ProgrammaticLogin pl = new ProgrammaticLogin(); 
    String realmName = "secureJDBCRealm"; 
    try { 
     pl.login("bob", "bob".toCharArray(), realmName, true); 
    } catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

Maintenant, quand je tente de lancer cela, un obtenir un LoginException prétendant que je ne LoginModule configuré pour « fileRealm ». Mais "fileRealm" n'est pas le domaine que je recherche (je l'ai mis là pour tester la première fois, mais ensuite je l'ai changé pour "secureJDBCRealm", qui est notre domaine de sécurité personnalisé pour GlassFish). Nous utilisons arquillian-glassfish-embedded-3.1 pour tester.

  • Est-ce que quelqu'un sait où définir le Royaume d'Arquillian?
  • Pourquoi mon application continue-t-elle de rechercher fileRealm? Est-ce la valeur par défaut? (n'a trouvé aucune spécification ici)

Répondre

3

Arquillian ne fournit aucun support pour la définition de domaines. Au lieu de cela, vous devez configurer vous-même le domaine dans le conteneur. C'est un peu difficile quand on utilise un conteneur Glassfish intégré, mais c'est faisable.

Je suppose que secureJDBCRealm est un domaine personnalisé et ne fait pas partie des domaines Glassfish standard/intégrés. Pour configurer un domaine personnalisé dans un conteneur Glassfish embedded vous devez:

  1. Placez un fichier login.conf sur le chemin de classe de test qui fait référence au royaume. Pour ce faire, ajoutez un répertoire de configuration à votre répertoire de ressources et placez login.conf dans ce répertoire. Votre login.conf ressemblera à quelque chose comme ça

    secureJDBCRealm { 
        com.blah.blah.LoginModule required; 
    }; 
    
  2. Votre domaine personnalisé ainsi que toutes les dépendances doivent être sur le chemin de classe de test.

  3. Vous devez créer par programme le domaine dans glassfish. Cela peut être fait via org.glassfish.embeddable.CommandRunner. Heureusement, le conteneur embarqué Arquillian rend ce disponible via JNDI qui signifie que vous pouvez effectuer les opérations suivantes:

    @Resource(mappedName = "org.glassfish.embeddable.CommandRunner") CommandRunner commandRunner; 
    
    public void configureLoginRealm() { 
        CommandResult commandResult = commandRunner.run("create-auth-realm", "--classname=com.blah.blah.SecureJDBCRealm", "--property=jaas-context= secureJDBCRealm", "secure-JDBC-realm"); 
        log.debug(commandResult.getExitStatus().toString() + " " + commandResult.getOutput()); 
        Throwable throwable = commandResult.getFailureCause(); 
        if (throwable != null) { 
         log.error(throwable.getMessage(), throwable); 
        } 
    } 
    

    }

  4. Vous pouvez alors vous connecter avec programme

    ProgrammaticLogin pl = new ProgrammaticLogin(); 
    String realmName = "secureJDBCRealm"; 
    try { 
        pl.login("bob", "bob".toCharArray(), realmName, true); 
    } catch (Exception e){ 
        e.printStackTrace(); 
    } finally { 
        pl.logout(); 
    } 
    
+0

Merci! Cependant, nous avons fini par utiliser un GlassFish distant avec le domaine correct déjà préconfiguré. Le support à distance est apparu il n'y a pas si longtemps, donc nous n'avons pas vu cette possibilité au début. – bmurauer

+1

L'interface CommanderRunner a changé et cela ne fonctionne plus: -/Glassfish 3.1.2.2 –

Questions connexes